Changeset 24360 for issm/trunk-jpl/src/c/classes/Elements/Element.cpp
- Timestamp:
- 11/19/19 16:40:16 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r24359 r24360 2067 2067 2068 2068 /*update input*/ 2069 this->Set BoolInput(this->inputs2,name,constant);2069 this->SetIntInput(this->inputs2,name,constant); 2070 2070 } 2071 2071 /*}}}*/ … … 3301 3301 *parray_size = 1; 3302 3302 break; 3303 case ArrayInput2Enum:{ 3304 int M; 3305 this->inputs2->GetArray(output_enum,this->lid,NULL,&M); 3306 *pinterpolation = P0ArrayEnum; 3307 *pnodesperelement = 1; 3308 *parray_size = M; 3309 } 3310 break; 3303 3311 default: 3304 3312 _error_("Input type \""<<EnumToStringx(this->inputs2->GetInputObjectEnum(output_enum))<<"\" not supported yet"); … … 3321 3329 void Element::ResultToMatrix(IssmDouble* values,int ncols,int output_enum){/*{{{*/ 3322 3330 3323 I nput2* input=this->GetInput2(output_enum);3324 i f(!input) _error_("input "<<EnumToStringx(output_enum)<<" not found in element");3325 3326 _error_("not implemented yet");3327 //input->ResultToMatrix(values,ncols,this->Sid());3331 IssmDouble* array = NULL; 3332 int m; 3333 this->inputs2->GetArray(output_enum,this->lid,&array,&m); 3334 for(int i=0;i<m;i++) values[this->Sid()*ncols + i] = array[i]; 3335 xDelete<IssmDouble>(array); 3328 3336 3329 3337 } /*}}}*/ … … 3617 3625 3618 3626 /*Intermediary variables: {{{*/ 3619 IssmDouble isinitialized=0.0;3627 bool isinitialized; 3620 3628 IssmDouble zTop=0.0; 3621 3629 IssmDouble dzTop=0.0; … … 3735 3743 /*}}}*/ 3736 3744 /*Retrieve inputs: {{{*/ 3737 _error_("fix....");3738 3745 Input2 *zTop_input = this->GetInput2(SmbZTopEnum); _assert_(zTop_input); 3739 3746 Input2 *dzTop_input = this->GetInput2(SmbDzTopEnum); _assert_(dzTop_input); … … 3749 3756 Input2 *teValue_input = this->GetInput2(SmbTeValueEnum); _assert_(teValue_input); 3750 3757 Input2 *aValue_input = this->GetInput2(SmbAValueEnum); _assert_(aValue_input); 3751 3752 TransientInput2 *Ta_input = this->inputs2->GetTransientInput(SmbTaEnum); _assert_(Ta_input); 3753 TransientInput2 *V_input = this->inputs2->GetTransientInput(SmbVEnum); _assert_(V_input); 3754 TransientInput2 *Dlwr_input = this->inputs2->GetTransientInput(SmbDlwrfEnum); _assert_(Dlwr_input); 3755 TransientInput2 *Dswr_input = this->inputs2->GetTransientInput(SmbDswrfEnum); _assert_(Dswr_input); 3756 TransientInput2 *P_input = this->inputs2->GetTransientInput(SmbPEnum); _assert_(P_input); 3757 TransientInput2 *eAir_input = this->inputs2->GetTransientInput(SmbEAirEnum); _assert_(eAir_input); 3758 TransientInput2 *pAir_input = this->inputs2->GetTransientInput(SmbPAirEnum); _assert_(pAir_input); 3758 Input2 *EC_input = this->GetInput2(SmbECiniEnum); _assert_(EC_input); 3759 3759 3760 3760 /*Retrieve input values:*/ … … 3778 3778 3779 3779 /*First, check that the initial structures have been setup in GEMB. If not, initialize profile variables: layer thickness dz, * density d, temperature T, etc. {{{*/ 3780 if( isinitialized==0.0){3780 if(!isinitialized){ 3781 3781 if(VerboseSmb() && this->Sid()==0)_printf0_("smb core: Initializing grid\n"); 3782 3782 //if(this->Sid()==1) for(int i=0;i<m;i++)_printf_("z[" << i << "]=" << 3783 3783 //dz[i] << "\n"); 3784 3784 3785 DoubleArrayInput* dz_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbDziniEnum)); _assert_(dz_input); 3786 DoubleArrayInput* d_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbDiniEnum));_assert_(d_input); 3787 DoubleArrayInput* re_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbReiniEnum));_assert_(re_input); 3788 DoubleArrayInput* gdn_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbGdniniEnum));_assert_(gdn_input); 3789 DoubleArrayInput* gsp_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbGspiniEnum));_assert_(gsp_input); 3790 DoubleInput* EC_input= dynamic_cast<DoubleInput*>(this->GetInput(SmbECiniEnum));_assert_(EC_input); 3791 DoubleArrayInput* W_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbWiniEnum));_assert_(W_input); 3792 DoubleArrayInput* a_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbAiniEnum));_assert_(a_input); 3793 DoubleArrayInput* T_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbTiniEnum));_assert_(T_input); 3794 3795 dz_input->GetValues(&dzini,&m); 3796 d_input->GetValues(&dini,&m); 3797 re_input->GetValues(&reini,&m); 3798 gdn_input->GetValues(&gdnini,&m); 3799 gsp_input->GetValues(&gspini,&m); 3800 EC_input->GetInputValue(&EC); 3801 W_input->GetValues(&Wini,&m); 3802 a_input->GetValues(&aini,&m); 3803 T_input->GetValues(&Tini,&m); 3785 this->inputs2->GetArray(SmbDziniEnum,this->lid,&dzini,&m); 3786 this->inputs2->GetArray(SmbDiniEnum,this->lid,&dini,&m); 3787 this->inputs2->GetArray(SmbReiniEnum,this->lid,&reini,&m); 3788 this->inputs2->GetArray(SmbGdniniEnum,this->lid,&gdnini,&m); 3789 this->inputs2->GetArray(SmbGspiniEnum,this->lid,&gspini,&m); 3790 this->inputs2->GetArray(SmbWiniEnum,this->lid,&Wini,&m); 3791 this->inputs2->GetArray(SmbAiniEnum,this->lid,&aini,&m); 3792 this->inputs2->GetArray(SmbTiniEnum,this->lid,&Tini,&m); 3793 EC_input->GetInputAverage(&EC); 3804 3794 3805 3795 /*Retrive the correct value of m (without the zeroes at the end)*/ 3806 Input* Size_input=this->GetInput(SmbSizeiniEnum); _assert_(Size_input); 3807 Size_input->GetInputValue(&m); 3796 this->GetInput2Value(&m,SmbSizeiniEnum); 3808 3797 3809 3798 if(m==2){ //Snow properties are initialized with default values. Vertical grid has to be initialized too … … 3813 3802 GembgridInitialize(&dz, &m, zTop, dzTop, zMax, zY); 3814 3803 3815 d = xNew ZeroInit<IssmDouble>(m); for(int i=0;i<m;i++)d[i]=dini[0]; //ice density [kg m-3]3816 re = xNew ZeroInit<IssmDouble>(m); for(int i=0;i<m;i++)re[i]=reini[0]; //set grain size to old snow [mm]3817 gdn = xNew ZeroInit<IssmDouble>(m); for(int i=0;i<m;i++)gdn[i]=gdnini[0]; //set grain dentricity to old snow3818 gsp = xNew ZeroInit<IssmDouble>(m); for(int i=0;i<m;i++)gsp[i]=gspini[0]; //set grain sphericity to old snow3819 W = xNew ZeroInit<IssmDouble>(m); for(int i=0;i<m;i++)W[i]=Wini[0]; //set water content to zero [kg m-2]3820 a = xNew ZeroInit<IssmDouble>(m); for(int i=0;i<m;i++)a[i]=aini[0]; //set albedo equal to fresh snow [fraction]3821 T = xNew ZeroInit<IssmDouble>(m); for(int i=0;i<m;i++)T[i]=Tmean; //set initial grid cell temperature to the annual mean temperature [K]3804 d = xNew<IssmDouble>(m); for(int i=0;i<m;i++)d[i]=dini[0]; //ice density [kg m-3] 3805 re = xNew<IssmDouble>(m); for(int i=0;i<m;i++)re[i]=reini[0]; //set grain size to old snow [mm] 3806 gdn = xNew<IssmDouble>(m); for(int i=0;i<m;i++)gdn[i]=gdnini[0]; //set grain dentricity to old snow 3807 gsp = xNew<IssmDouble>(m); for(int i=0;i<m;i++)gsp[i]=gspini[0]; //set grain sphericity to old snow 3808 W = xNew<IssmDouble>(m); for(int i=0;i<m;i++)W[i]=Wini[0]; //set water content to zero [kg m-2] 3809 a = xNew<IssmDouble>(m); for(int i=0;i<m;i++)a[i]=aini[0]; //set albedo equal to fresh snow [fraction] 3810 T = xNew<IssmDouble>(m); for(int i=0;i<m;i++)T[i]=Tmean; //set initial grid cell temperature to the annual mean temperature [K] 3822 3811 /*/!\ Default value of T can not be retrived from SMBgemb.m (like other snow properties) 3823 3812 * because don't know Tmean yet when set default values. … … 3830 3819 // if(VerboseSmb() && this->Sid()==0)_printf0_("Snow properties initialized w RESTART values\n"); 3831 3820 3832 dz = xNew ZeroInit<IssmDouble>(m);for(int i=0;i<m;i++)dz[i]=dzini[i];3833 d = xNew ZeroInit<IssmDouble>(m);for(int i=0;i<m;i++)d[i]=dini[i];3834 re = xNew ZeroInit<IssmDouble>(m);for(int i=0;i<m;i++)re[i]=reini[i];3835 gdn = xNew ZeroInit<IssmDouble>(m);for(int i=0;i<m;i++)gdn[i]=gdnini[i];3836 gsp = xNew ZeroInit<IssmDouble>(m);for(int i=0;i<m;i++)gsp[i]=gspini[i];3837 W = xNew ZeroInit<IssmDouble>(m);for(int i=0;i<m;i++)W[i]=Wini[i];3838 a = xNew ZeroInit<IssmDouble>(m);for(int i=0;i<m;i++)a[i]=aini[i];3839 T = xNew ZeroInit<IssmDouble>(m);for(int i=0;i<m;i++)T[i]=Tini[i];3821 dz = xNew<IssmDouble>(m);for(int i=0;i<m;i++)dz[i]=dzini[i]; 3822 d = xNew<IssmDouble>(m);for(int i=0;i<m;i++)d[i]=dini[i]; 3823 re = xNew<IssmDouble>(m);for(int i=0;i<m;i++)re[i]=reini[i]; 3824 gdn = xNew<IssmDouble>(m);for(int i=0;i<m;i++)gdn[i]=gdnini[i]; 3825 gsp = xNew<IssmDouble>(m);for(int i=0;i<m;i++)gsp[i]=gspini[i]; 3826 W = xNew<IssmDouble>(m);for(int i=0;i<m;i++)W[i]=Wini[i]; 3827 a = xNew<IssmDouble>(m);for(int i=0;i<m;i++)a[i]=aini[i]; 3828 T = xNew<IssmDouble>(m);for(int i=0;i<m;i++)T[i]=Tini[i]; 3840 3829 3841 3830 //fixed lower temperature bounday condition - T is fixed 3831 _assert_(m>0); 3842 3832 T_bottom=T[m-1]; 3843 3833 } 3844 3834 3845 3835 /*Flag the initialization:*/ 3846 this-> AddInput(new DoubleInput(SmbIsInitializedEnum,1.0));3836 this->SetBoolInput(this->inputs2,SmbIsInitializedEnum,true); 3847 3837 } 3848 3838 else{ 3849 3839 /*Recover inputs: */ 3850 DoubleArrayInput* dz_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbDzEnum)); _assert_(dz_input); 3851 DoubleArrayInput* d_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbDEnum));_assert_(d_input); 3852 DoubleArrayInput* re_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbReEnum));_assert_(re_input); 3853 DoubleArrayInput* gdn_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbGdnEnum));_assert_(gdn_input); 3854 DoubleArrayInput* gsp_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbGspEnum));_assert_(gsp_input); 3855 DoubleInput* EC_input= dynamic_cast<DoubleInput*>(this->GetInput(SmbECEnum));_assert_(EC_input); 3856 DoubleArrayInput* W_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbWEnum));_assert_(W_input); 3857 DoubleArrayInput* a_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbAEnum));_assert_(a_input); 3858 DoubleArrayInput* T_input= dynamic_cast<DoubleArrayInput*>(this->GetInput(SmbTEnum));_assert_(T_input); 3859 3860 /*Recover arrays: */ 3861 dz_input->GetValues(&dz,&m); 3862 d_input->GetValues(&d,&m); 3863 re_input->GetValues(&re,&m); 3864 gdn_input->GetValues(&gdn,&m); 3865 gsp_input->GetValues(&gsp,&m); 3866 EC_input->GetInputValue(&EC); 3867 W_input->GetValues(&W,&m); 3868 a_input->GetValues(&a,&m); 3869 T_input->GetValues(&T,&m); 3840 this->inputs2->GetArray(SmbDzEnum,this->lid,&dzini,&m); 3841 this->inputs2->GetArray(SmbDEnum,this->lid,&dini,&m); 3842 this->inputs2->GetArray(SmbReEnum,this->lid,&reini,&m); 3843 this->inputs2->GetArray(SmbGdnEnum,this->lid,&gdnini,&m); 3844 this->inputs2->GetArray(SmbGspEnum,this->lid,&gspini,&m); 3845 this->inputs2->GetArray(SmbWEnum,this->lid,&Wini,&m); 3846 this->inputs2->GetArray(SmbAEnum,this->lid,&aini,&m); 3847 this->inputs2->GetArray(SmbTEnum,this->lid,&Tini,&m); 3848 EC_input->GetInputAverage(&EC); 3870 3849 3871 3850 //fixed lower temperature bounday condition - T is fixed 3851 _assert_(m>0); 3872 3852 T_bottom=T[m-1]; 3873 3853 … … 3888 3868 if (isclimatology){ 3889 3869 //If this is a climatology, we need to repeat the forcing after the final time 3890 offsetend = Ta_input->GetTimeInputOffset(finaltime); 3891 time0 = Ta_input->GetTimeByOffset(-1); 3892 timeend = Ta_input->GetTimeByOffset(offsetend); 3870 TransientInput2* Ta_input_tr = this->inputs2->GetTransientInput(SmbTaEnum); _assert_(Ta_input_tr); 3871 offsetend = Ta_input_tr->GetTimeInputOffset(finaltime); 3872 time0 = Ta_input_tr->GetTimeByOffset(-1); 3873 timeend = Ta_input_tr->GetTimeByOffset(offsetend); 3893 3874 if (time>time0 & timeend>time0){ 3894 3875 delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0))); … … 3903 3884 if(VerboseSmb() && this->Sid()==0 && IssmComm::GetRank()==0)_printf0_("Time: t=" << setprecision(8) << t/365.0/24.0/3600.0 << " yr/" << (time+dt)/365.0/24.0/3600.0 << " yr" << setprecision(3) << " Step: " << count << "\n"); 3904 3885 3905 Input2* Ta_input 2 = this->GetInput2(SmbTaEnum,t-time+timeclim); _assert_(Ta_input2);3906 Input2 *V_input 2= this->GetInput2(SmbVEnum,t-time+timeclim); _assert_(V_input);3907 Input2 *Dlwr_input 2= this->GetInput2(SmbDlwrfEnum,t-time+timeclim); _assert_(Dlwr_input);3908 Input2 *Dswr_input 2= this->GetInput2(SmbDswrfEnum,t-time+timeclim); _assert_(Dswr_input);3909 Input2 *P_input 2= this->GetInput2(SmbPEnum,t-time+timeclim); _assert_(P_input);3910 Input2 *eAir_input 2= this->GetInput2(SmbEAirEnum,t-time+timeclim); _assert_(eAir_input);3911 Input2 *pAir_input 2= this->GetInput2(SmbPAirEnum,t-time+timeclim); _assert_(pAir_input);3886 Input2* Ta_input = this->GetInput2(SmbTaEnum,t-time+timeclim); _assert_(Ta_input); 3887 Input2 *V_input = this->GetInput2(SmbVEnum,t-time+timeclim); _assert_(V_input); 3888 Input2 *Dlwr_input= this->GetInput2(SmbDlwrfEnum,t-time+timeclim); _assert_(Dlwr_input); 3889 Input2 *Dswr_input= this->GetInput2(SmbDswrfEnum,t-time+timeclim); _assert_(Dswr_input); 3890 Input2 *P_input = this->GetInput2(SmbPEnum,t-time+timeclim); _assert_(P_input); 3891 Input2 *eAir_input= this->GetInput2(SmbEAirEnum,t-time+timeclim); _assert_(eAir_input); 3892 Input2 *pAir_input= this->GetInput2(SmbPAirEnum,t-time+timeclim); _assert_(pAir_input); 3912 3893 3913 3894 /*extract daily data:{{{*/ 3914 Ta_input 2->GetInputValue(&Ta,gauss);//screen level air temperature [K]3895 Ta_input->GetInputValue(&Ta,gauss);//screen level air temperature [K] 3915 3896 V_input->GetInputValue(&V,gauss); //wind speed [m s-1] 3916 3897 Dlwr_input->GetInputValue(&dlw,gauss); //downward longwave radiation flux [W m-2]
Note:
See TracChangeset
for help on using the changeset viewer.