Changeset 27646
- Timestamp:
- 03/17/23 16:55:57 (2 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/SmbAnalysis.cpp
r27510 r27646 225 225 iomodel->FindConstant(&ismethod,"md.smb.ismethod"); 226 226 if (ismethod == 1){ 227 // initial albedo: TODO: this is not needed. 228 //if(VerboseSolution()) _printf0_(" smb semic: UpdateElements - albedo.\n"); 227 if(VerboseSolution()) _printf0_(" smb semic: UpdateElements - albedo.\n"); 229 228 iomodel->FetchDataToInput(inputs,elements,"md.smb.albedo",SmbAlbedoInitEnum); 230 229 iomodel->FetchDataToInput(inputs,elements,"md.smb.albedo_snow",SmbAlbedoSnowInitEnum); … … 239 238 // assign masking 240 239 iomodel->FetchDataToInput(inputs,elements,"md.smb.mask",SmbMaskEnum); 240 iomodel->FetchDataToInput(inputs,elements,"md.smb.qmr",SmbSemicQmrInitEnum); 241 241 if(VerboseSolution()) _printf0_(" smb semic: UpdateElements - done.\n"); 242 242 } -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r27586 r27646 31 31 IssmDouble *qq_in, IssmDouble *tt_in, IssmDouble *tsurf_out, IssmDouble *smb_out, IssmDouble *saccu_out, IssmDouble *smelt_out); 32 32 33 extern "C" void run_semic_transient_(IssmDouble *sf_in, IssmDouble *rf_in, IssmDouble *swd_in, IssmDouble *lwd_in, IssmDouble *wind_in, IssmDouble *sp_in, IssmDouble *rhoa_in, 34 IssmDouble *qq_in, IssmDouble *tt_in, IssmDouble *tsurf_in, IssmDouble *tstic, 33 extern "C" void run_semic_transient_(int *nx, int *ntime, int *nloop, 34 IssmDouble *sf_in, IssmDouble *rf_in, IssmDouble *swd_in, 35 IssmDouble *lwd_in, IssmDouble *wind_in, IssmDouble *sp_in, IssmDouble *rhoa_in, 36 IssmDouble *qq_in, IssmDouble *tt_in, IssmDouble *tsurf_in, IssmDouble *qmr_in, 37 IssmDouble *tstic, 35 38 IssmDouble *hcrit, IssmDouble *rcrit, 36 39 IssmDouble *mask, IssmDouble *hice, IssmDouble *hsnow, … … 38 41 int *alb_scheme, IssmDouble *alb_smax, IssmDouble *alb_smin, IssmDouble *albi, IssmDouble *albl, 39 42 IssmDouble *Tamp, 40 IssmDouble *tmin, IssmDouble *tmax, IssmDouble *tmid, IssmDouble *mcrit, IssmDouble *wcrit, IssmDouble *tau_a, IssmDouble* tau_f, IssmDouble *afac, 41 IssmDouble *tsurf_out, IssmDouble *smb_out, IssmDouble *smbi_out, IssmDouble *smbs_out, IssmDouble *saccu_out, IssmDouble *smelt_out, IssmDouble *albedo_out, IssmDouble *albedo_snow_out, IssmDouble *hsnow_out, IssmDouble *hice_out );43 IssmDouble *tmin, IssmDouble *tmax, IssmDouble *tmid, IssmDouble *mcrit, IssmDouble *wcrit, IssmDouble *tau_a, IssmDouble* tau_f, IssmDouble *afac, bool *verbose, 44 IssmDouble *tsurf_out, IssmDouble *smb_out, IssmDouble *smbi_out, IssmDouble *smbs_out, IssmDouble *saccu_out, IssmDouble *smelt_out, IssmDouble *albedo_out, IssmDouble *albedo_snow_out, IssmDouble *hsnow_out, IssmDouble *hice_out, IssmDouble *qmr_out); 42 45 #endif 43 46 // _HAVE_SEMIC_ … … 4231 4234 void Element::SmbSemicTransient(){/*{{{*/ 4232 4235 4236 bool isverbose=VerboseSmb(); 4237 if(isverbose && this->Sid()==0){ 4238 _printf0_("smb core: initialize.\n"); 4239 } 4233 4240 /*only compute SMB at the surface: */ 4234 4241 if (!IsOnSurface()) return; 4235 4242 4236 4243 const int NUM_VERTICES = this->GetNumberOfVertices(); 4237 const int NLOOP = 10; // default internal iteration for SEMIC (Ruckamp et al. 2018).4238 4244 4239 4245 // daily forcing inputs … … 4261 4267 IssmDouble* hice_in =xNew<IssmDouble>(NUM_VERTICES); 4262 4268 IssmDouble* hsnow_in =xNew<IssmDouble>(NUM_VERTICES); 4269 IssmDouble* qmr_in =xNew<IssmDouble>(NUM_VERTICES); 4263 4270 4264 4271 // outputs … … 4271 4278 IssmDouble* albedo_out =xNew<IssmDouble>(NUM_VERTICES); memset(albedo_out, 0., NUM_VERTICES*sizeof(IssmDouble)); 4272 4279 IssmDouble* albedo_snow_out =xNew<IssmDouble>(NUM_VERTICES); memset(albedo_snow_out, 0., NUM_VERTICES*sizeof(IssmDouble)); 4273 IssmDouble* hsnow_out 4280 IssmDouble* hsnow_out =xNew<IssmDouble>(NUM_VERTICES); memset(hsnow_out, 0., NUM_VERTICES*sizeof(IssmDouble)); 4274 4281 IssmDouble* hice_out =xNew<IssmDouble>(NUM_VERTICES); memset(hice_out, 0., NUM_VERTICES*sizeof(IssmDouble)); 4282 IssmDouble* qmr_out =xNew<IssmDouble>(NUM_VERTICES); memset(qmr_out, 0., NUM_VERTICES*sizeof(IssmDouble)); 4275 4283 4276 4284 IssmDouble rho_water,rho_ice,desfac,desfacElev,rlaps,rdl; … … 4325 4333 GetInputListOnVertices(&s0gcm[0],SmbS0gcmEnum); 4326 4334 4327 if( VerboseSmb()&& this->Sid()==0){4335 if(isverbose && this->Sid()==0){ 4328 4336 _printf0_("smb core: allocate inputs.\n"); 4329 4337 _printf0_("smb core: time_yr : " << time_yr/yts <<"\n"); … … 4345 4353 4346 4354 /*temporal Enum depending on time*/ 4347 int enum_temp =TemperatureSEMICEnum;4348 int enum_hice =SmbHIceEnum;4349 int enum_hsnow =SmbHSnowEnum;4350 int enum_albedo =SmbAlbedoEnum;4355 int enum_temp =TemperatureSEMICEnum; 4356 int enum_hice =SmbHIceEnum; 4357 int enum_hsnow =SmbHSnowEnum; 4358 int enum_albedo =SmbAlbedoEnum; 4351 4359 int enum_albedo_snow=SmbAlbedoSnowEnum; 4360 int enum_qmr =SmbSemicQmrEnum; 4352 4361 if (tstart+dt == time) { 4353 4362 /* Load inital value at first time step*/ … … 4357 4366 enum_albedo=SmbAlbedoInitEnum; 4358 4367 enum_albedo_snow=SmbAlbedoSnowInitEnum; 4368 enum_qmr =SmbSemicQmrInitEnum; 4359 4369 } 4370 if(isverbose && this->Sid()==0)_printf0_("smb core: assign temp.\n"); 4360 4371 Input* tsurf_input = this->GetInput(enum_temp); _assert_(tsurf_in); 4372 if(isverbose && this->Sid()==0)_printf0_("smb core: assign mask.\n"); 4361 4373 Input* mask_input = this->GetInput(SmbMaskEnum); _assert_(mask_input); 4374 if(isverbose && this->Sid()==0)_printf0_("smb core: assign Tamp.\n"); 4362 4375 Input* Tamp_input = this->GetInput(SmbTampEnum); _assert_(Tamp_input); 4376 if(isverbose && this->Sid()==0)_printf0_("smb core: assign albedo.\n"); 4363 4377 Input* albedo_input = this->GetInput(enum_albedo); _assert_(albedo_input); 4364 4378 Input* albedo_snow_input = this->GetInput(enum_albedo_snow); _assert_(albedo_snow_input); 4365 4379 Input* hice_input = this->GetInput(enum_hice); _assert_(hice_input); 4366 4380 Input* hsnow_input = this->GetInput(enum_hsnow); _assert_(hsnow_input); 4367 4368 if(VerboseSmb() && this->Sid()==0)_printf0_("smb core: assign inputs.\n"); 4381 if(isverbose && this->Sid()==0)_printf0_("smb core: assign qmr.\n"); 4382 Input* qmr_input = this->GetInput(enum_qmr); _assert_(qmr_input); 4383 4384 if(isverbose && this->Sid()==0)_printf0_("smb core: assign inputs done....\n"); 4369 4385 for(int iv=0;iv<NUM_VERTICES;iv++){ 4370 4386 gauss->GaussVertex(iv); … … 4389 4405 hsnow_input->GetInputValue(&hsnow_in[iv],gauss); 4390 4406 hice_input->GetInputValue(&hice_in[iv],gauss); 4407 qmr_input->GetInputValue(&qmr_in[iv],gauss); 4391 4408 4392 4409 /* Surface temperature correction */ … … 4407 4424 dailydlradiation[iv]=dailydlradiation[iv]+rdl*st[iv]; 4408 4425 } 4409 if( VerboseSmb()&& this->Sid()==0){4426 if(isverbose && this->Sid()==0){ 4410 4427 _printf0_("smb core: assign tsurf_in :" << tsurf_in[0] << "\n"); 4411 4428 _printf0_("smb core: assign dailytemperature:" << dailytemperature[0] << "\n"); … … 4413 4430 _printf0_("smb core: assign hice :" << hice_in[0] << "\n"); 4414 4431 _printf0_("smb core: assign mask :" << mask_in[0] << "\n"); 4432 _printf0_("smb core: assign Tamp :" << Tamp_in[0] << "\n"); 4415 4433 _printf0_("smb core: assign albedo :" << albedo_in[0] << "\n"); 4416 4434 _printf0_("smb core: assign albedo_snow :" << albedo_snow_in[0] << "\n"); 4417 4435 _printf0_("smb core: assign albedo_scheme :" << alb_scheme << "\n"); 4418 } 4419 4420 if(VerboseSmb() && this->Sid()==0)_printf0_("smb core: call semic module.\n"); 4436 _printf0_("smb core: assign qmr :" << qmr_in[0] << "\n"); 4437 } 4438 4439 if(isverbose && this->Sid()==0)_printf0_("smb core: call run_semic_transient module.\n"); 4440 /* call semic */ 4441 int nx=NUM_VERTICES, ntime=1, nloop=1; 4442 bool semic_verbose=false; //VerboseSmb(); 4443 run_semic_transient_(&nx, &ntime, &nloop, 4444 dailysnowfall, dailyrainfall, dailydsradiation, dailydlradiation, 4445 dailywindspeed, dailypressure, dailyairdensity, dailyairhumidity, dailytemperature, tsurf_in, qmr_in, 4446 &dt, 4447 &hcrit, &rcrit, 4448 mask_in, hice_in, hsnow_in, 4449 albedo_in, albedo_snow_in, 4450 &alb_scheme, &alb_smax, &alb_smin, &albi, &albl, 4451 Tamp_in, 4452 &tmin, &tmax, &tmid, &mcrit, &wcrit, &tau_a, &tau_f, &afac, &semic_verbose, 4453 tsurf_out, smb_out, smbi_out, smbs_out, saccu_out, smelt_out,albedo_out, albedo_snow_out, hsnow_out, hice_out, qmr_out); 4454 4421 4455 for (int iv = 0; iv<NUM_VERTICES; iv++){ 4422 /* call semic */4423 run_semic_transient_(&dailysnowfall[iv], &dailyrainfall[iv], &dailydsradiation[iv], &dailydlradiation[iv],4424 &dailywindspeed[iv], &dailypressure[iv], &dailyairdensity[iv], &dailyairhumidity[iv], &dailytemperature[iv], &tsurf_in[iv], &dt,4425 &hcrit, &rcrit,4426 &mask_in[iv], &hice_in[iv], &hsnow_in[iv],4427 &albedo_in[iv], &albedo_snow_in[iv],4428 &alb_scheme, &alb_smax, &alb_smin, &albi, &albl,4429 &Tamp_in[iv],4430 &tmin, &tmax, &tmid, &mcrit, &wcrit, &tau_a, &tau_f, &afac,4431 &tsurf_out[iv], &smb_out[iv], &smbi_out[iv], &smbs_out[iv], &saccu_out[iv], &smelt_out[iv],&albedo_out[iv], &albedo_snow_out[iv], &hsnow_out[iv], &hice_out[iv]);4432 4433 4456 /* 4434 4457 unit conversion: water -> ice … … 4440 4463 } 4441 4464 4442 if(VerboseSmb() && this->Sid()==0){ 4443 _printf0_("smb core: tsurf_out[0] " << tsurf_out[0] << "\n"); 4444 _printf0_("smb core: hice_out[0] " << hice_out[0] << "\n"); 4445 _printf0_("smb core: hsnow_out[0] " << hsnow_out[0] << "\n"); 4446 _printf0_("smb core: smb_ice[0] " << smbi_out[0]*yts << "\n"); 4465 if(isverbose && this->Sid()==0){ 4466 _printf0_("smb core: tsurf_out " << tsurf_out[0] << " " << tsurf_out[1] << " " << tsurf_out[2] << "\n"); 4467 _printf0_("smb core: hice_out " << hice_out[0] << " " << hice_out[1] << " " << hice_out[2] << "\n"); 4468 _printf0_("smb core: hsnow_out " << hsnow_out[0] << "\n"); 4469 _printf0_("smb core: smb_ice " << smbi_out[0]*yts << "\n"); 4470 _printf0_("smb core: smb_ice " << albedo_out[0] <<" "<<albedo_out[1] << " " << albedo_out[2] << "\n"); 4447 4471 } 4448 4472 4449 4473 switch(this->ObjectEnum()){ 4450 4474 case TriaEnum: 4451 this->AddInput(TemperatureSEMICEnum, &tsurf_out[0],P1DGEnum);4475 this->AddInput(TemperatureSEMICEnum, &tsurf_out[0],P1DGEnum); 4452 4476 // SMBout = SMB_ice + SMB_snow values. 4453 4477 //this->AddInput(SmbMassBalanceTotalEnum,&smb_out[0],P1DGEnum); 4454 4478 // water equivalent SMB ice to ice equivalent. 4455 this->AddInput(SmbMassBalanceEnum, &smbi_out[0],P1DGEnum);4479 this->AddInput(SmbMassBalanceEnum, &smbi_out[0],P1DGEnum); 4456 4480 this->AddInput(SmbMassBalanceSnowEnum,&smbs_out[0],P1DGEnum); 4457 4481 //this->AddInput(SmbMassBalanceSnowEnum,&smbs_out[0],P1DGEnum); … … 4459 4483 this->AddInput(SmbAccumulationEnum,&saccu_out[0],P1DGEnum); 4460 4484 // smelt 4461 this->AddInput(SmbMeltEnum,&smelt_out[0],P1DGEnum); 4462 this->AddInput(SmbAlbedoEnum,&albedo_out[0],P1DGEnum); 4463 this->AddInput(SmbAlbedoSnowEnum,&albedo_snow_out[0],P1DGEnum); 4464 this->AddInput(SmbHSnowEnum,&hsnow_out[0],P1DGEnum); 4465 this->AddInput(SmbHIceEnum,&hice_out[0],P1DGEnum); 4485 this->AddInput(SmbMeltEnum, &smelt_out[0],P1DGEnum); 4486 this->AddInput(SmbAlbedoEnum, &albedo_out[0],P1DGEnum); 4487 this->AddInput(SmbAlbedoSnowEnum, &albedo_snow_out[0],P1DGEnum); 4488 this->AddInput(SmbHSnowEnum, &hsnow_out[0],P1DGEnum); 4489 this->AddInput(SmbHIceEnum, &hice_out[0],P1DGEnum); 4490 this->AddInput(SmbSemicQmrEnum, &qmr_out[0],P1DGEnum); 4466 4491 break; 4467 4492 case PentaEnum: … … 4498 4523 xDelete<IssmDouble>(hsnow_out); 4499 4524 xDelete<IssmDouble>(hice_out); 4525 xDelete<IssmDouble>(qmr_out); 4500 4526 4501 4527 /*for inputs*/ … … 4507 4533 xDelete<IssmDouble>(albedo_snow_in); 4508 4534 xDelete<IssmDouble>(tsurf_in); 4535 xDelete<IssmDouble>(qmr_in); 4509 4536 4510 4537 /* for inputs:geometry */ -
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/run_semic_transient.f90
r27587 r27646 1 subroutine run_semic_transient(sf_in, rf_in, swd_in, lwd_in, wind_in, & 2 sp_in, rhoa_in, qq_in, tt_in, tsurf_in, tstic, & 1 subroutine run_semic_transient(nx, ntime, nloop, sf_in, rf_in, swd_in, lwd_in, wind_in, & 2 sp_in, rhoa_in, qq_in, tt_in, tsurf_in, qmr_in, & 3 tstic, & 3 4 hcrit, rcrit, & 4 5 mask, hice, hsnow, & … … 6 7 alb_scheme, alb_smax, alb_smin, albi, albl, & 7 8 Tamp, & 8 tmin, tmax, tmid, mcrit, w_crit, tau_a, tau_f, afac, & 9 tsurf_out, smb_out, smbi_out, smbs_out, saccu_out, smelt_out, alb_out, alb_snow_out,hsnow_out,hice_out) 9 tmin, tmax, tmid, mcrit, w_crit, tau_a, tau_f, afac, verbose, & 10 tsurf_out, smb_out, smbi_out, smbs_out, saccu_out, smelt_out, alb_out, & 11 alb_snow_out,hsnow_out,hice_out,qmr_out) !{{{ 10 12 11 13 use utils 12 14 use surface_physics 13 14 15 implicit none 15 16 … … 17 18 type(surface_physics_class) :: surface 18 19 ! declare forcing class 19 type(forc_class) :: forc20 !type(forc_class) :: forc 20 21 ! declare validation class 21 22 !type(vali_class) :: vali ! validation not needed here 22 23 23 24 integer, parameter:: dp=kind(0.d0) !< define precision (machine specific) 24 integer :: i, k, nx, nloop, year 25 integer :: day=1 !< not used value. 25 integer :: i, k, n 26 integer :: nnx, nny 27 integer :: year=0 28 integer :: day =1 !< not used value. 29 integer, intent(in) :: nx, ntime, nloop ! number of grid / number of times 30 logical, intent(in) :: verbose ! verbosity 31 logical :: debug=.false. 26 32 27 33 ! forcing data 28 double precision, intent(in) :: sf_in ! snow fall rate [m/s] 29 double precision, intent(in) :: rf_in ! rain fall rate [m/s] 30 double precision, intent(in) :: swd_in ! downwelling shortwave radiation [W/m2] 31 double precision, intent(in) :: lwd_in ! downwelling longwave radiation [W/m2] 32 double precision, intent(in) :: wind_in! surface wind speed [m/s] 33 double precision, intent(in) :: sp_in ! surface pressure [Pa] 34 double precision, intent(in) :: rhoa_in! air density [kg/m3] 35 double precision, intent(in) :: qq_in ! air specific humidity [kg/kg] 36 double precision, intent(in) :: tt_in ! air temperature [K] 34 ! input argument format array size (nx, ntime)... 35 double precision, intent(in), dimension(nx):: sf_in ! snow fall rate [m/s] 36 double precision, intent(in), dimension(nx):: rf_in ! rain fall rate [m/s] 37 double precision, intent(in), dimension(nx):: swd_in ! downwelling shortwave radiation [W/m2] 38 double precision, intent(in), dimension(nx):: lwd_in ! downwelling longwave radiation [W/m2] 39 double precision, intent(in), dimension(nx):: wind_in ! surface wind speed [m/s] 40 double precision, intent(in), dimension(nx):: sp_in ! surface pressure [Pa] 41 double precision, intent(in), dimension(nx):: rhoa_in ! air density [kg/m3] 42 double precision, intent(in), dimension(nx):: qq_in ! air specific humidity [kg/kg] 43 double precision, intent(in), dimension(nx):: tt_in ! air temperature [K] 37 44 38 45 ! input data 39 46 double precision, intent(in) :: tstic ! time step from ISSM [sec]. 40 double precision, intent(in) :: tsurf_in ! input temperature [K]41 47 42 48 ! output data 43 double precision, intent(out) :: tsurf_out ! Ice surface Temperature [K] 44 double precision, intent(out) :: smb_out ! surface mass balance=(Accu-Melt) [m/s] 45 double precision, intent(out) :: smbi_out ! SMB ice [water equivalent m/s] 46 double precision, intent(out) :: smbs_out ! SMB snow [water equivalent m/s] 47 double precision, intent(out) :: saccu_out ! accumulation [m/s] 48 double precision, intent(out) :: smelt_out ! ablation [m/s] 49 double precision, intent(out) :: alb_out ! grid-averaged albedo [no unit] 50 double precision, intent(out) :: alb_snow_out 51 double precision :: qmr_out 52 !double precision, intent(out) :: qmr_out 53 double precision, intent(out) :: hice_out 54 double precision, intent(out) :: hsnow_out 49 ! Ice surface Temperature [K] 50 double precision, intent(out), dimension(nx):: tsurf_out 51 ! surface mass balance=(Accu-Melt) [m/s] 52 double precision, intent(out), dimension(nx):: smb_out 53 double precision, intent(out), dimension(nx):: smbi_out ! SMB ice [water equivalent m/s] 54 double precision, intent(out), dimension(nx):: smbs_out ! SMB snow [water equivalent m/s] 55 double precision, intent(out), dimension(nx):: saccu_out ! accumulation [m/s] 56 double precision, intent(out), dimension(nx):: smelt_out ! ablation [m/s] 57 double precision, intent(out), dimension(nx):: alb_out ! grid-averaged albedo [no unit] 58 double precision, intent(out), dimension(nx):: alb_snow_out 59 double precision, intent(out), dimension(nx):: hice_out 60 double precision, intent(out), dimension(nx):: hsnow_out 61 double precision, intent(out), dimension(nx):: qmr_out 55 62 56 63 double precision :: total_time, start, finish 57 64 58 65 ! set parameters 59 character (len=256) :: name ! not used(?)60 character (len=256) :: boundary(30) ! not used(?)66 !character (len=256) :: name ! not used(?) 67 !character (len=256) :: boundary(30) ! not used(?) 61 68 !character (len=256), intent(in) :: alb_scheme !< name of albedo scheme 62 69 integer, intent(in) :: alb_scheme 63 integer :: n_ksub 64 double precision :: ceff !< surface heat heat capacity of snow/ice [J/W m2] 65 double precision, intent(in) :: hsnow 66 double precision, intent(in) :: hice 70 !integer :: n_ksub 71 !double precision :: ceff !< surface heat heat capacity of snow/ice [J/W m2] 72 double precision, intent(in), dimension(nx):: albedo 73 double precision, intent(in), dimension(nx):: albedo_snow !< spatial.. 74 double precision, intent(in), dimension(nx):: hsnow 75 double precision, intent(in), dimension(nx):: hice 76 double precision, intent(in), dimension(nx):: tsurf_in !< input temperature [K] 77 double precision, intent(in), dimension(nx):: qmr_in 78 double precision, intent(in), dimension(nx):: mask 79 67 80 double precision, intent(in) :: albi 68 81 double precision, intent(in) :: albl 69 double precision, intent(in) :: mask70 double precision, intent(in) :: albedo71 double precision, intent(in) :: albedo_snow72 82 double precision, intent(in) :: alb_smax 73 83 double precision, intent(in) :: alb_smin … … 75 85 double precision, intent(in) :: rcrit !< critical snow height fro which refreezing fraction is 50% [m] 76 86 double precision, intent(in) :: Tamp 77 double precision :: csh78 double precision :: clh87 !double precision :: csh 88 !double precision :: clh 79 89 double precision, intent(in) :: tmin 80 90 double precision, intent(in) :: tmax 81 double precision :: tsticsub91 !double precision :: tsticsub 82 92 ! parameters for isba albedo scheme. 83 93 double precision, intent(in) :: tau_a !< critical liquide water concent for "isba" albedo scheme [kg/m2] … … 88 98 double precision, intent(in) :: tmid !< param for "alex" albedo parameterization [K] 89 99 90 nx = 1 91 year = 0 100 if (debug) then 101 print*,' ntime: ', ntime 102 print*,' nx : ', nx 103 end if 92 104 93 105 ! set vector length 94 106 surface%par%nx = nx 95 107 96 ! set input (forcing data)97 !forc%sf(:,:) = sf_in ! snowfall flux [m/sec]98 !forc%rf(:,:) = rf_in ! rainfall flux [m/sec]99 !forc%swd(:,:) = swd_in ! short radiation100 !forc%lwd(:,:) = lwd_in ! long radiation downward101 !forc%wind(:,:) = wind_in ! wind speed.102 !forc%sp(:,:) = sp_in ! surface pressure103 !forc%rhoa(:,:) = rhoa_in ! air density [kg/m3]104 !forc%qq(:,:) = qq_in ! air specific humidity [kg/kg]105 !forc%tt(:,:) = tt_in ! 2m air temperature106 107 108 ! FIXME should be user input 108 109 !boundary = "" "" "" 109 !surface%par%tstic = 86400.0_dp !< time step [s] in one day. 110 if (debug) then 111 print*, "run_semic_transient: initialize parameters." 112 end if 110 113 surface%par%tstic = tstic !< time step [s] 111 114 surface%par%ceff= 2.0e6_dp !< surface heat capacity of snow/ice [J/K/m2] … … 114 117 surface%par%alb_smax = alb_smax !0.79_dp !< max snow albedo 115 118 surface%par%alb_smin = alb_smin !0.6_dp !< min snow albedo 116 surface%par%albi = albi ! 0.41_dp !< albedo for ice117 surface%par%albl = albl ! 0.07_dp !< albedo for land119 surface%par%albi = albi ! 0.41_dp !< albedo for ice 120 surface%par%albl = albl ! 0.07_dp !< albedo for land 118 121 surface%par%tmin = tmin ! -999_dp 119 122 surface%par%tmax = tmax ! 273.15_dp … … 122 125 surface%par%amp = Tamp !3.0_dp !< amplitude of diurnal cycle [K] 123 126 if (alb_scheme == 0) then 124 surface%par%alb_scheme=" None"127 surface%par%alb_scheme="none" 125 128 else if (alb_scheme == 1) then 126 129 surface%par%alb_scheme = "slater" … … 129 132 else if (alb_scheme == 3) then 130 133 surface%par%alb_scheme = "isba" 134 else 135 print*, "ERROR: current albedo scheme is not available." 136 call exit(1) 131 137 end if 132 138 surface%par%tau_a = tau_a !0.008_dp … … 134 140 surface%par%w_crit = w_crit !15.0_dp ! default value 135 141 surface%par%mcrit = mcrit !6.0e-8_dp 136 surface%par%n_ksub = 3 .0_dp142 surface%par%n_ksub = 3 ! sub ... 137 143 ! snow albedo of alex 138 144 surface%par%afac = afac … … 146 152 147 153 ! initialise prognostic variables 154 if (debug) then 155 print*,"run_semic_transient: initialize variables." 156 end if 148 157 ! these values will be updated through "surface_energy_and_mass_balance" function. 149 surface%now%mask(:) = mask ! 2.0_dp !loi_mask(:nx) 150 surface%now%hsnow(:) = hsnow ! initial snow height... 151 surface%now%hice(:) = hice ! initial ice height.. 152 surface%now%tsurf(:) = tsurf_in 153 surface%now%alb(:) = albedo !< initial albedo for energy balance. 154 surface%now%alb_snow(:) = albedo_snow !< initial albedo for ISBA albedo method. 155 surface%now%qmr_res(:) = 0.0_dp ! residual heat. 156 157 ! initialize with zeros 158 surface%now%qmr(:) = 0.0_dp 159 160 tsurf_out = 0.0_dp 161 smb_out = 0.0_dp 162 smbi_out = 0.0_dp 163 smbs_out = 0.0_dp 164 saccu_out = 0.0_dp 165 smelt_out = 0.0_dp 166 alb_out = 0.0_dp 167 alb_snow_out = 0.0_dp 158 surface%now%mask (:) = mask (:) ! 2.0_dp !loi_mask(:nx) 159 if (debug) then 160 print*,"run_semic_transient: initialize variables: mask" 161 end if 162 surface%now%hsnow (:) = hsnow (:) ! initial snow height... 163 surface%now%hice (:) = hice (:) ! initial ice height.. 164 surface%now%tsurf (:) = tsurf_in (:) !< initial ice surface temperature 165 surface%now%alb (:) = albedo (:) !< initial albedo for energy balance. 166 surface%now%alb_snow(:) = albedo_snow(:) !< initial albedo for ISBA albedo method. 167 if (debug) then 168 print*,"run_semic_transient: initialize variables. DONE." 169 end if 170 171 if (debug) then 172 !print*, "====== global variable ==========" 173 !print*, "nloop :", nloop 174 !print*, "nx :", surface%par%nx 175 !print*, "====== parameters ======" 176 !print*, "csh :", surface%par%csh 177 !print*, "clh :", surface%par%clh 178 !print*, "albeo scheme :", surface%par%alb_scheme 179 !print*, "albeo ice :", surface%par%albi 180 !print*, "tstic :", surface%par%tstic 181 !print*, "tsticsub :", surface%par%tsticsub 182 !print*, "n_ksub :", surface%par%n_ksub 183 print*, "====== inputs =========" 184 print*, "hsnow :", hsnow 185 print*, "====== state variables ======" 186 print*, "hsnow :", surface%now%hsnow 187 print*, "hice :", surface%now%hice 188 print*, "albeo :", surface%now%alb 189 print*, "albeo snow :", surface%now%alb_snow 190 print*, "mask :", surface%now%mask 191 print*, "tsurf :", surface%now%tsurf 192 print*, "sf :", sf_in 193 end if 168 194 169 195 ! define boundary conditions (not used, here!) … … 171 197 !call print_boundary_opt(surface%bnd) 172 198 173 174 199 ! input with single value 175 surface%now%sf = sf_in 176 surface%now%rf = rf_in 177 surface%now%sp = sp_in 178 surface%now%lwd = lwd_in 179 surface%now%swd = swd_in 180 surface%now%wind = wind_in 181 surface%now%rhoa = rhoa_in 182 surface%now%t2m = tt_in 183 surface%now%qq = qq_in 184 185 ! calculate prognostic and diagnsotic variables 186 call cpu_time(start) 187 call surface_energy_and_mass_balance(surface%now,surface%par,surface%bnd,day,-1) 188 call cpu_time(finish) 189 total_time = total_time + (finish - start) 190 191 tsurf_out=surface%now%tsurf(1) 192 ! melt - potential surface melt [m/s] 193 ! smb = SMB_ice + SMB_snow 194 ! smbi - SMB_ice (water equivalent m/sec) 195 ! smbs - SMB_snow (water equivalent m/sec) 196 smb_out =surface%now%smb(1) ! smb = smb_snow + smb_ice 197 smbi_out =surface%now%smb_ice(1) ! Csi (snow>ice) - melted_ice + refrezon_rain. 198 smbs_out =surface%now%smb_snow(1) ! smb_snow = snowfall - sublimiation - melted_snow + refrozen_snow 199 saccu_out =surface%now%acc(1) ! acc = snowfall - sublimiation - refreezing 200 smelt_out =surface%now%melt(1) ! potential surface melt = melt_ice + melt_snow 201 alb_out =surface%now%alb(1) 202 alb_snow_out =surface%now%alb_snow(1) 203 qmr_out =surface%now%qmr(1) 204 hsnow_out =surface%now%hsnow(1) 205 hice_out =surface%now%hice(1) 200 do k =1,nloop 201 do i =1,ntime 202 if (debug) then 203 print*,"run_semic_transient: forcing data: ntime = ", i 204 end if 205 surface%now%sf = sf_in !(:,i) 206 surface%now%rf = rf_in !(:,i) 207 surface%now%sp = sp_in !(:,i) 208 surface%now%lwd = lwd_in !(:,i) 209 surface%now%swd = swd_in !(:,i) 210 surface%now%wind = wind_in!(:,i) 211 surface%now%rhoa = rhoa_in!(:,i) 212 surface%now%t2m = tt_in !(:,i) 213 surface%now%qq = qq_in !(:,i) 214 ! qmr_res is used to "energy_balance" in semic. 215 surface%now%qmr_res = qmr_in 216 217 ! calculate prognostic and diagnsotic variables 218 call surface_energy_and_mass_balance(surface%now,surface%par,surface%bnd,i,year) 219 220 if (debug) then 221 print*,"done..." 222 end if 223 if (k == nloop) then 224 tsurf_out = surface%now%tsurf 225 ! melt - potential surface melt [m/s] 226 ! smb = SMB_ice + SMB_snow 227 ! smbi - SMB_ice (water equivalent m/sec) 228 ! smbs - SMB_snow (water equivalent m/sec) 229 smb_out =surface%now%smb ! smb = smb_snow + smb_ice 230 smbi_out =surface%now%smb_ice ! Csi (snow>ice) - melted_ice + refrezon_rain. 231 smbs_out =surface%now%smb_snow ! smb_snow = snowfall - sublimiation - melted_snow + refrozen_snow 232 saccu_out =surface%now%acc ! acc = snowfall - sublimiation - refreezing 233 smelt_out =surface%now%melt ! potential surface melt = melt_ice + melt_snow 234 alb_out =surface%now%alb 235 alb_snow_out =surface%now%alb_snow 236 hsnow_out =surface%now%hsnow 237 hice_out =surface%now%hice 238 qmr_out =surface%now%qmr_res 239 end if 240 end do 241 end do 206 242 207 243 ! de-allocate surface_physics arrays 208 244 call surface_dealloc(surface%now) 209 245 210 !write(*,*) 'total time for surface_physics:', nloop, total_time 211 212 end subroutine run_semic_transient 246 end subroutine run_semic_transient ! }}} -
issm/trunk-jpl/src/c/shared/Enum/Enum.vim
r27510 r27646 1118 1118 syn keyword cConstant SmbS0pEnum 1119 1119 syn keyword cConstant SmbS0tEnum 1120 syn keyword cConstant SmbSemicQmrEnum 1121 syn keyword cConstant SmbSemicQmrInitEnum 1120 1122 syn keyword cConstant SmbSizeiniEnum 1121 1123 syn keyword cConstant SmbSmbCorrEnum -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r27510 r27646 1115 1115 SmbS0pEnum, 1116 1116 SmbS0tEnum, 1117 SmbSemicQmrEnum, 1118 SmbSemicQmrInitEnum, 1117 1119 SmbSizeiniEnum, 1118 1120 SmbSmbCorrEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r27510 r27646 1120 1120 case SmbS0pEnum : return "SmbS0p"; 1121 1121 case SmbS0tEnum : return "SmbS0t"; 1122 case SmbSemicQmrEnum : return "SmbSemicQmr"; 1123 case SmbSemicQmrInitEnum : return "SmbSemicQmrInit"; 1122 1124 case SmbSizeiniEnum : return "SmbSizeini"; 1123 1125 case SmbSmbCorrEnum : return "SmbSmbCorr"; -
issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim
r27510 r27646 1111 1111 syn keyword juliaConstC SmbS0pEnum 1112 1112 syn keyword juliaConstC SmbS0tEnum 1113 syn keyword juliaConstC SmbSemicQmrEnum 1114 syn keyword juliaConstC SmbSemicQmrInitEnum 1113 1115 syn keyword juliaConstC SmbSizeiniEnum 1114 1116 syn keyword juliaConstC SmbSmbCorrEnum -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r27510 r27646 1147 1147 else if (strcmp(name,"SmbS0p")==0) return SmbS0pEnum; 1148 1148 else if (strcmp(name,"SmbS0t")==0) return SmbS0tEnum; 1149 else if (strcmp(name,"SmbSemicQmr")==0) return SmbSemicQmrEnum; 1150 else if (strcmp(name,"SmbSemicQmrInit")==0) return SmbSemicQmrInitEnum; 1149 1151 else if (strcmp(name,"SmbSizeini")==0) return SmbSizeiniEnum; 1150 1152 else if (strcmp(name,"SmbSmbCorr")==0) return SmbSmbCorrEnum; … … 1242 1244 else if (strcmp(name,"VyAverage")==0) return VyAverageEnum; 1243 1245 else if (strcmp(name,"VyBase")==0) return VyBaseEnum; 1244 else if (strcmp(name,"VyDebris")==0) return VyDebrisEnum;1245 else if (strcmp(name,"Vy")==0) return VyEnum;1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"VyMesh")==0) return VyMeshEnum; 1249 if (strcmp(name,"VyDebris")==0) return VyDebrisEnum; 1250 else if (strcmp(name,"Vy")==0) return VyEnum; 1251 else if (strcmp(name,"VyMesh")==0) return VyMeshEnum; 1250 1252 else if (strcmp(name,"VyObs")==0) return VyObsEnum; 1251 1253 else if (strcmp(name,"VyShear")==0) return VyShearEnum; … … 1365 1367 else if (strcmp(name,"Outputdefinition95")==0) return Outputdefinition95Enum; 1366 1368 else if (strcmp(name,"Outputdefinition96")==0) return Outputdefinition96Enum; 1367 else if (strcmp(name,"Outputdefinition97")==0) return Outputdefinition97Enum;1368 else if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;1369 1369 else stage=12; 1370 1370 } 1371 1371 if(stage==12){ 1372 if (strcmp(name,"Outputdefinition99")==0) return Outputdefinition99Enum; 1372 if (strcmp(name,"Outputdefinition97")==0) return Outputdefinition97Enum; 1373 else if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum; 1374 else if (strcmp(name,"Outputdefinition99")==0) return Outputdefinition99Enum; 1373 1375 else if (strcmp(name,"Outputdefinition9")==0) return Outputdefinition9Enum; 1374 1376 else if (strcmp(name,"Outputdefinition100")==0) return Outputdefinition100Enum; … … 1488 1490 else if (strcmp(name,"Fset")==0) return FsetEnum; 1489 1491 else if (strcmp(name,"FullMeltOnPartiallyFloating")==0) return FullMeltOnPartiallyFloatingEnum; 1490 else if (strcmp(name,"GLheightadvectionAnalysis")==0) return GLheightadvectionAnalysisEnum;1491 else if (strcmp(name,"GaussPenta")==0) return GaussPentaEnum;1492 1492 else stage=13; 1493 1493 } 1494 1494 if(stage==13){ 1495 if (strcmp(name,"GaussSeg")==0) return GaussSegEnum; 1495 if (strcmp(name,"GLheightadvectionAnalysis")==0) return GLheightadvectionAnalysisEnum; 1496 else if (strcmp(name,"GaussPenta")==0) return GaussPentaEnum; 1497 else if (strcmp(name,"GaussSeg")==0) return GaussSegEnum; 1496 1498 else if (strcmp(name,"GaussTetra")==0) return GaussTetraEnum; 1497 1499 else if (strcmp(name,"GaussTria")==0) return GaussTriaEnum; … … 1611 1613 else if (strcmp(name,"MinVel")==0) return MinVelEnum; 1612 1614 else if (strcmp(name,"MinVx")==0) return MinVxEnum; 1613 else if (strcmp(name,"MinVy")==0) return MinVyEnum;1614 else if (strcmp(name,"MinVz")==0) return MinVzEnum;1615 1615 else stage=14; 1616 1616 } 1617 1617 if(stage==14){ 1618 if (strcmp(name,"MismipFloatingMeltRate")==0) return MismipFloatingMeltRateEnum; 1618 if (strcmp(name,"MinVy")==0) return MinVyEnum; 1619 else if (strcmp(name,"MinVz")==0) return MinVzEnum; 1620 else if (strcmp(name,"MismipFloatingMeltRate")==0) return MismipFloatingMeltRateEnum; 1619 1621 else if (strcmp(name,"Moulin")==0) return MoulinEnum; 1620 1622 else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum; … … 1734 1736 else if (strcmp(name,"TaylorHood")==0) return TaylorHoodEnum; 1735 1737 else if (strcmp(name,"Tetra")==0) return TetraEnum; 1736 else if (strcmp(name,"TetraInput")==0) return TetraInputEnum;1737 else if (strcmp(name,"ThermalAnalysis")==0) return ThermalAnalysisEnum;1738 1738 else stage=15; 1739 1739 } 1740 1740 if(stage==15){ 1741 if (strcmp(name,"ThermalSolution")==0) return ThermalSolutionEnum; 1741 if (strcmp(name,"TetraInput")==0) return TetraInputEnum; 1742 else if (strcmp(name,"ThermalAnalysis")==0) return ThermalAnalysisEnum; 1743 else if (strcmp(name,"ThermalSolution")==0) return ThermalSolutionEnum; 1742 1744 else if (strcmp(name,"ThicknessErrorEstimator")==0) return ThicknessErrorEstimatorEnum; 1743 1745 else if (strcmp(name,"TotalCalvingFluxLevelset")==0) return TotalCalvingFluxLevelsetEnum;
Note:
See TracChangeset
for help on using the changeset viewer.