Changeset 26249
- Timestamp:
- 05/06/21 20:44:39 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/cores/love_core.cpp
r26245 r26249 164 164 165 165 if (vi!=0 && omega!=0.0){ //take into account viscosity in the rigidity if the material isn't a perfect fluid 166 //Otherwise return the elastic value167 166 IssmDouble ka=la0 + 2.0/3.0*mu0; //Bulk modulus 168 167 if (rheo==2){//EBM … … 203 202 204 203 mu=mu0*omega*(omega+mu2/vi2)/((omega+mu2/vi2)*(omega+mu0/vi)+mu0/vi2*omega); 205 la=ka-2.0/3.0*mu 0;204 la=ka-2.0/3.0*mu; 206 205 } 207 206 else{//Maxwell … … 210 209 } 211 210 } 212 211 else{//Otherwise return the elastic value 212 la=la0; 213 mu=mu0; 214 } 213 215 *pla=la; 214 216 *pmu=mu; … … 444 446 dy[1*6+1]= -2.0/x-fgr/rg0; 445 447 } 446 448 */ /*}}}*/ 447 449 448 450 if(issolid==1){ … … 453 455 454 456 for (id=0;id<ny;id++){ 457 dydx[id]=0.0; 455 458 for (iy=0;iy<ny;iy++){ 456 459 nindex=layer_index*nstep*36+n*36; 457 dydx[id] =dydx[id]+yi_prefactor[nindex+id*6+iy]*y[iy];460 dydx[id]+=yi_prefactor[nindex+id*6+iy]*y[iy]; 458 461 } 459 462 } 460 463 return; 461 464 }/*}}}*/ 462 template <typename doubletype> void propagate_yi_euler( IssmDouble* y, IssmDouble xmin, IssmDouble xmax, int layer_index, IssmDouble* yi_prefactor, FemModel* femmodel, Matlitho* matlitho){ /*{{{*/465 template <typename doubletype> void propagate_yi_euler(doubletype* y, IssmDouble xmin, IssmDouble xmax, int layer_index, doubletype* yi_prefactor, FemModel* femmodel, Matlitho* matlitho){ /*{{{*/ 463 466 //yields this: if we have y[j]=1.0 and y[!j]=0.0 at the bottom of the layer, what is y at the top of the layer? 464 467 //euler method … … 466 469 femmodel->parameters->FindParam(&nstep,LoveIntStepsPerLayerEnum); 467 470 468 IssmDouble* dydx=xNewZeroInit<IssmDouble>(6);471 doubletype* dydx=xNewZeroInit<doubletype>(6); 469 472 IssmDouble dr = (xmax -xmin)/nstep; 470 473 IssmDouble x=xmin; … … 476 479 x = x + dr; 477 480 } 478 xDelete< IssmDouble>(dydx);481 xDelete<doubletype>(dydx); 479 482 }/*}}}*/ 480 483 template <typename doubletype> void propagate_yi_RK2(doubletype* y, IssmDouble xmin, IssmDouble xmax, int layer_index, doubletype* yi_prefactor, FemModel* femmodel, Matlitho* matlitho){ /*{{{*/ … … 681 684 if (matlitho->issolid[i]){ 682 685 one = -1.0; 683 if (i>0 &&!matlitho->issolid[i-1]) one = 1.0;686 if (i>0) if (!matlitho->issolid[i-1]) one = 1.0; 684 687 for (int j=0;j<6;j++){ 685 688 yi[(j+6*ici)+ nyi*(j+6*ici+3)] = one; … … 891 894 if (loveratio<=underflow_tol || xIsNan(loveratio) || xIsInf(loveratio)){//We need to delete a layer and try again if the ratio between deepest love number to surface love number is too low (risk of underflow) or garbage 892 895 if(VerboseSolution()){ 893 printf("\n Degree: %i, surface/Depth Love number ratio small: %e\n",deg, loveratio);894 printf(" Changing the interface where the integration starts\n");895 printf(" New start interface: r=%gm\n\n", matlitho->radius[starting_layer+1]);896 _printf_("\n Degree: " << deg <<", surface/Depth Love number ratio small: "<<loveratio<<"\n"); 897 _printf_(" Changing the interface where the integration starts\n"); 898 _printf_(" New start interface: r="<< matlitho->radius[starting_layer+1] <<"m\n\n"); 896 899 } 897 900 nyi-=6; … … 1005 1008 bool allow_layer_deletion,love_kernels, istemporal; 1006 1009 bool verbosemod = (int)VerboseModule(); 1007 IssmDouble g0,r0,mu0, underflow_tol;1010 IssmDouble mu0, underflow_tol; 1008 1011 IssmDouble *frequencies = NULL; 1009 1012 bool save_results; … … 1040 1043 femmodel->parameters->FindParam(&sh_nmax,LoveShNmaxEnum); 1041 1044 femmodel->parameters->FindParam(&sh_nmin,LoveShNminEnum); 1042 femmodel->parameters->FindParam(&g0,LoveG0Enum);1043 femmodel->parameters->FindParam(&r0,LoveR0Enum);1044 1045 femmodel->parameters->FindParam(&mu0,LoveMu0Enum); 1045 1046 femmodel->parameters->FindParam(&allow_layer_deletion,LoveAllowLayerDeletionEnum); … … 1126 1127 femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveLiEnum,LoveLf,sh_nmax+1,nfreq,0,0)); 1127 1128 1129 /*Only when love_kernels is on*/ 1130 if (love_kernels==1) { 1131 femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveKernelsEnum,LoveKernels,(sh_nmax+1)*(matlitho->numlayers+1)*6,nfreq,0,0)); 1132 } 1133 1134 /*Free resources:*/ 1135 xDelete<IssmDouble>(frequencies); 1136 xDelete<doubletype>(LoveKf); 1137 xDelete<doubletype>(LoveHf); 1138 xDelete<doubletype>(LoveLf); 1139 xDelete<doubletype>(LoveKernels); 1140 1141 /* Legacy for fortran core, to be removed after complete validation */ 1142 1143 //IssmDouble g0,r0; 1144 //femmodel->parameters->FindParam(&g0,LoveG0Enum); 1145 //femmodel->parameters->FindParam(&r0,LoveR0Enum); 1146 //IssmDouble* LoveKr = xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1)); 1147 //IssmDouble* LoveHr = xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1)); 1148 //IssmDouble* LoveLr = xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1)); 1149 //IssmDouble* LoveKi = xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1)); 1150 //IssmDouble* LoveHi = xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1)); 1151 //IssmDouble* LoveLi = xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1)); 1152 1153 /*Initialize love kernels (real and imaginary parts): */ 1154 //IssmDouble* LoveKernelsr= xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1)*(matlitho->numlayers+1)*6); 1155 //IssmDouble* LoveKernelsi= xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1)*(matlitho->numlayers+1)*6); 1128 1156 1129 1157 /*call the main module: */ 1130 1158 //if (false){ 1131 //FourierLoveCorex(LoveKr,LoveKi,LoveHr,LoveH i,LoveLr,LoveLi,LoveKernelsReal,LoveKernelsImag, //output1159 //FourierLoveCorex(LoveKr,LoveKi,LoveHr,LoveHr,LoveLr,LoveLi,LoveKernelsr,LoveKernelsi, //output 1132 1160 // nfreq,frequencies,sh_nmax,sh_nmin,g0,r0,mu0,allow_layer_deletion,forcing_type,verbosemod, //parameter inputs 1133 1161 // matlitho->numlayers, matlitho->radius, matlitho->viscosity, matlitho->lame_lambda, matlitho->lame_mu, 1134 1162 // matlitho->burgers_viscosity, matlitho->burgers_mu, matlitho->density, matlitho->rheologymodel, matlitho->issolid //matlitho inputs 1135 1163 // ); 1164 1165 1166 /*Only when love_kernels is on*/ 1167 //if (love_kernels==1) { 1168 //femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveKernelsEnum,LoveKernelsr,(sh_nmax+1)*(matlitho->numlayers+1)*6,nfreq,0,0)); 1169 //femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveKernelsImagEnum,LoveKernelsImag,(sh_nmax+1)*(matlitho->numlayers+1)*6,nfreq,0,0)); 1136 1170 //} 1171 1137 1172 1138 1173 /*Add love matrices to results:*/ … … 1144 1179 //femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveLiEnum,LoveLi,sh_nmax+1,nfreq,0,0)); 1145 1180 1146 /*Only when love_kernels is on*/ 1147 if (love_kernels==1) { 1148 femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveKernelsEnum,LoveKernels,(sh_nmax+1)*(matlitho->numlayers+1)*6,nfreq,0,0)); 1149 //femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveKernelsImagEnum,LoveKernelsImag,(sh_nmax+1)*(matlitho->numlayers+1)*6,nfreq,0,0)); 1150 } 1151 1152 /*Free resources:*/ 1153 xDelete<IssmDouble>(frequencies); 1154 xDelete<doubletype>(LoveKf); 1155 xDelete<doubletype>(LoveHf); 1156 xDelete<doubletype>(LoveLf); 1181 1182 1183 //xDelete<IssmDouble>(LoveKr); 1184 //xDelete<IssmDouble>(LoveHr); 1185 //xDelete<IssmDouble>(LoveLr); 1186 //xDelete<IssmDouble>(LoveKernelsr); 1187 //xDelete<IssmDouble>(LoveKi); 1188 //xDelete<IssmDouble>(LoveHi); 1157 1189 //xDelete<IssmDouble>(LoveLi); 1158 xDelete<doubletype>(LoveKernels); 1190 //xDelete<IssmDouble>(LoveKernelsi); 1191 1159 1192 } /*}}}*/ 1160 1193 … … 1173 1206 template void propagate_yi_RK2<IssmDouble>(IssmDouble* y, IssmDouble xmin, IssmDouble xmax, int layer_index, IssmDouble* yi_prefactor, FemModel* femmodel, Matlitho* matlitho); 1174 1207 template void propagate_yi_RK2<IssmComplex>(IssmComplex* y, IssmDouble xmin, IssmDouble xmax, int layer_index, IssmComplex* yi_prefactor, FemModel* femmodel, Matlitho* matlitho); 1208 template void propagate_yi_euler<IssmDouble>(IssmDouble* y, IssmDouble xmin, IssmDouble xmax, int layer_index, IssmDouble* yi_prefactor, FemModel* femmodel, Matlitho* matlitho); 1209 template void propagate_yi_euler<IssmComplex>(IssmComplex* y, IssmDouble xmin, IssmDouble xmax, int layer_index, IssmComplex* yi_prefactor, FemModel* femmodel, Matlitho* matlitho); 1175 1210 template void Innersphere_boundaryconditions<IssmDouble>(IssmDouble* yi, int layer_index, int deg, IssmDouble omega, FemModel* femmodel, Matlitho* matlitho, LoveVariables* vars); 1176 1211 template void Innersphere_boundaryconditions<IssmComplex>(IssmComplex* yi, int layer_index, int deg, IssmComplex omega, FemModel* femmodel, Matlitho* matlitho, LoveVariables* vars);
Note:
See TracChangeset
for help on using the changeset viewer.