intn write_swath(int32 swfid, char* sname, int xdim, int ydim, int zdim) { char field_name[]= "temperature"; char field_dim_name[]= "ZDim,xtrack,ytrack"; char geo_name[]= "pressure"; char geo_name_lon[]= "Longitude"; char geo_name_lat[]= "Latitude"; char geo_dim_name[]= "ZDim"; char geo_dim_name2[]= "xtrack,ytrack"; int swid = 0; swid = SWcreate(swfid, sname); if(swid == -1) { fprintf(stderr, "SWcreate() failed.\n"); return -1; } /* Define dimension. */ write_dimension(swid, xdim, ydim, zdim); /* Define geolocaiton fields. */ write_field_1d(swid, geo_name, 1, zdim, geo_dim_name); write_field_2d(swid, geo_name_lat, 1, xdim, ydim, geo_dim_name2); write_field_2d(swid, geo_name_lon, 1, xdim, ydim, geo_dim_name2); /* Write field. */ write_field_3d(swid, field_name, xdim, ydim, zdim, field_dim_name); /* Close the Grid. */ SWdetach(swid); return 0; }
herr_t write_za(hid_t zafid, char* sname) { hid_t zaid = FAIL; /* Create a Swath. */ zaid = HE5_ZAcreate(zafid, sname); /* Define dimension. */ write_dimension(zaid); /* Define geolocation fields. */ write_field_1d(zaid, "Pressure", "ZDim", 4); write_field_1d(zaid, "Latitude", "YDim", 8); /* Define data fields. */ write_field_2d(zaid, "Temperature"); /* Write attributes. */ write_attr(zaid, "Pressure", "units", "hPa"); write_attr(zaid, "Latitude", "units", "degrees_north"); write_attr(zaid, "Temperature", "units", "K"); /* Close the Swath. */ return HE5_ZAdetach(zaid); }
herr_t write_swath(hid_t swfid, char* sname) { hid_t swid = FAIL; /* Create a Swath. */ swid = HE5_SWcreate(swfid, sname); /* Define dimension. */ write_dimension(swid); /* Define geolocation fields. */ write_field_1d(swid, "Pressure", 1, 4, "ZDim", "hPa"); write_field_1d(swid, "Latitude", 1, 8, "NDim", "degrees_north"); write_field_1d(swid, "Longitude", 1, 8, "NDim", "degrees_east" ); /* Define data fields. */ write_field_2d(swid, "Temperature", 0, "ZDim,NDim", "K"); /* Close the Swath. */ return HE5_SWdetach(swid); }
herr_t write_grid(hid_t gdfid, char* gname) { double upleft[2]; double lowright[2]; herr_t status = FAIL; hid_t gdid = FAIL; int dummy = 0; long xdim = 8; long ydim = 4; /* Set corner points. */ upleft[0] = HE5_EHconvAng(0., HE5_HDFE_DEG_DMS); /* left */ upleft[1] = HE5_EHconvAng((float)ydim, HE5_HDFE_DEG_DMS); /* up */ lowright[0] = HE5_EHconvAng((float)xdim, HE5_HDFE_DEG_DMS); /* right */ lowright[1] = HE5_EHconvAng(0., HE5_HDFE_DEG_DMS); /* low */ /* Create Grids. */ gdid = HE5_GDcreate(gdfid, gname, xdim, ydim, upleft, lowright); /* Set projection. */ status = HE5_GDdefproj(gdid, HE5_GCTP_GEO, dummy, dummy, NULL); /* Write field. */ write_field_2d(gdid, "temperature"); /* Close the Grid. */ status = HE5_GDdetach(gdid); return status; }
int main(int argc, char **argv) { int scheme_flg, nfld; double *eta, *phi; double *velwM, *velwM2, *velw2M, *velw2M2; double t, dt, t_old; char init_data_buff[INIT_DATA_BUFSIZE], init_pars_buff[INIT_DATA_BUFSIZE], subid_buff[2], dtflag[20], nfld_buff[5]; fftw_complex *heta, *hphi; fftw_complex *hvelwM, *hvelwM2, *hvelw2M, *hvelw2M2; strncpy(init_pars_buff,"\0",INIT_DATA_BUFSIZE); //strncpy(init_pars_buff, Sim_root, strlen(Sim_root)); strncpy(init_pars_buff,"initpars.h5", strlen("initpars.h5")); /* Read input parameters file */ get_params(init_pars_buff); printf("Final time = %f\n",T); printf("dtsave = %f\n",dtsave); snprintf(subid_buff, 2,"%d",runsubid); strncpy(init_data_buff,"\0",INIT_DATA_BUFSIZE); strcat(init_data_buff,"initdata."); strcat(init_data_buff,subid_buff); strcat(init_data_buff,".h5"); nfld = 0; strncpy(savefile_buff,"\0",SAVE_FILE_BUFSIZE); strcat(savefile_buff,"data"); snprintf(nfld_buff, 5,"%d",nfld); strcat(savefile_buff,nfld_buff); strcat(savefile_buff,"."); strcat(savefile_buff,subid_buff); strcat(savefile_buff,".h5"); strncpy(savefile2_buff,"\0",SAVE_FILE_BUFSIZE); strcat(savefile2_buff,"data_extra"); snprintf(nfld_buff, 5,"%d",nfld); strcat(savefile2_buff,nfld_buff); strcat(savefile2_buff,"."); strcat(savefile2_buff,subid_buff); strcat(savefile2_buff,".h5"); Nxl = 4*Nx/2; Nyl = 4*Ny/2; g=1; NLevs=M; /* Define a total size to share time-stepping routines with 1d case */ /* N/2+1 = Nx*(Ny/2 + 1) */ N = 2*Nx*(Ny/2+1) - 2; eta = (double*) fftw_malloc(sizeof(double)*2*Nx*Ny); heta = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*2*Nx*(Ny/2+1)); phi = &eta[Nx*Ny]; hphi = &heta[Nx*(Ny/2+1)]; //hdummy = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*2*Nx*(Ny/2+1)); //k = malloc (sizeof(double)*Nx*(Ny/2+1)); f = malloc(sizeof(double)*Nx*Ny); ff = malloc(sizeof(double)*Nxl*Nyl); hf = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*Nx*(Ny/2+1)); hff = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*Nxl*(Nyl/2+1)); velwM = malloc(sizeof(double)*Nx*Ny); velwM2 = malloc(sizeof(double)*Nx*Ny); velw2M = malloc(sizeof(double)*Nx*Ny); velw2M2 = malloc(sizeof(double)*Nx*Ny); hvelwM = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*Nx*(Ny/2+1)); hvelwM2 = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*Nx*(Ny/2+1)); hvelw2M = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*Nx*(Ny/2+1)); hvelw2M2 = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*Nx*(Ny/2+1)); /* Setup fft routines */ //stat = fftw_init_threads(); //fftw_plan_with_nthreads(4); fftp = fftw_plan_dft_r2c_2d(Nx, Ny, f, hf, FFTW_ESTIMATE); ifftp = fftw_plan_dft_c2r_2d(Nx, Ny, hf, f, FFTW_ESTIMATE); fftp_large = fftw_plan_dft_r2c_2d(Nxl, Nyl, ff, hff, FFTW_ESTIMATE); ifftp_large = fftw_plan_dft_c2r_2d(Nxl, Nyl, hff, ff, FFTW_ESTIMATE); /* Read initial data */ printf("Reading initial condition from %s\n",init_data_buff); get_ic_2d(init_data_buff, eta, phi); /* Setup temporal scheme. */ scheme_flg=2; Setup_TimeScheme(scheme_flg); rhs_hos_setup(); t = 0; fft_2d(eta, heta, fftp); fft_2d(phi, hphi, fftp); ifft_2d(heta, eta, ifftp); ifft_2d(hphi, phi, ifftp); /* Dealiasing */ int mx, my, index; mx = floor( 0.5*Nx/(1 + 0.5*NLevs) ); my = floor( 0.5*Ny/(1 + 0.5*NLevs) ); for (int i=0; i<Nx; i++) { for (int j=0; j<Ny/2+1; j++) { if ( (i>=mx && i<(Nx-mx+1)) || (j>=my) ) { index = (Ny/2+1)*i + j; heta[index] = 0.0; hphi[index] = 0.0; } } } Zvel(heta, hvelwM, hvelwM2, hvelw2M, hvelw2M2, t); ifft_2d(hvelwM, velwM, ifftp); ifft_2d(hvelwM2, velwM2, ifftp); /* Save initial snapshot */ savefileid = create_file_2d(savefile_buff); write_header_2d(savefileid, t); write_field_2d(savefileid, eta, phi); status = close_file_2d(savefileid); savefileid2 = create_file_2d(savefile2_buff); write_header_2d(savefileid2, t); write_extra_2d(savefileid2, velwM, velwM2); status = close_file_2d(savefileid2); printf("Datafile written at t=%f\n",t); /* Time loop */ while (t<T-0.00000001) { t_old = t; dt = 0.025; sol_update_RK(heta,&t,dt,dtflag); //t = t + dt; if ( floor( (t*1.000000001)/dtsave) > floor((t_old*1.000000001)/dtsave) ) { nfld = nfld + 1; ifft_2d(heta, eta, ifftp); ifft_2d(hphi, phi, ifftp); /* Print field in output file */ strncpy(savefile_buff,"\0",SAVE_FILE_BUFSIZE); strcat(savefile_buff,"data"); snprintf(nfld_buff, 5,"%d",nfld); strcat(savefile_buff,nfld_buff); strcat(savefile_buff,"."); strcat(savefile_buff,subid_buff); strcat(savefile_buff,".h5"); strncpy(savefile2_buff,"\0",SAVE_FILE_BUFSIZE); strcat(savefile2_buff,"data_extra"); snprintf(nfld_buff, 5,"%d",nfld); strcat(savefile2_buff,nfld_buff); strcat(savefile2_buff,"."); strcat(savefile2_buff,subid_buff); strcat(savefile2_buff,".h5"); savefileid = create_file_2d(savefile_buff); write_header_2d(savefileid, t); write_field_2d(savefileid, eta, phi); status = close_file_2d(savefileid); savefileid2 = create_file_2d(savefile2_buff); write_header_2d(savefileid2, t); write_extra_2d(savefileid2, velwM, velwM2); status = close_file_2d(savefileid2); printf("Datafile written at t=%f\n",t); } } // // ifft_1d(heta, eta, ifftp); // ifft_1d(hphi, phi, ifftp); // // // fftw_destroy_plan(fftp); fftw_destroy_plan(ifftp); free(eta); fftw_free(heta); fftw_destroy_plan(fftp_large); fftw_destroy_plan(ifftp_large); return 0; }