3 #include "../toolkits/toolkits.h"
4 #include "../classes/classes.h"
5 #include "../classes/Inputs2/TransientInput2.h"
6 #include "../shared/shared.h"
7 #include "../modules/modules.h"
32 element->
Update(inputs2,i,iomodel,analysis_counter,analysis_type,
P1Enum);
40 iomodel->
FetchData(&geodetic,
"md.solidearth.settings.computesealevelchange");
47 iomodel->
FetchData(&dslmodel,
"md.dsl.model");
56 iomodel->
FetchData(&str,&M,&N,
"md.dsl.global_average_thermosteric_sea_level_change");
_assert_(M==2);
59 times=xNew<IssmDouble>(N);
60 for(
int t=0;t<N;t++) times[t] = str[N+t];
67 for(
int i=0;i<elements->
Size();i++){
74 default:
_error_(
"Not implemented yet");
80 xDelete<IssmDouble>(times);
81 iomodel->
DeleteData(str,
"md.dsl.global_average_thermosteric_sea_level_change");
88 else if (dslmodel==2){
100 iomodel->
FetchData(&pstr,&pM,&pN,&nummodels,
"md.dsl.global_average_thermosteric_sea_level_change");
103 for (
int i=0;i<nummodels;i++){
110 times=xNew<IssmDouble>(N);
111 for(
int t=0;t<N;t++) times[t] = str[(M-1)*N+t];
115 for(
int j=0;j<elements->
Size();j++){
118 for(
int t=0;t<N;t++){
122 default:
_error_(
"Not implemented yet");
126 xDelete<IssmDouble>(times);
129 for(
int i=0;i<nummodels;i++){
131 xDelete<IssmDouble>(str);
133 xDelete<IssmDouble*>(pstr);
138 iomodel->
FetchData(&pstr,&pM,&pN,&nummodels,
"md.dsl.sea_surface_height_change_above_geoid");
140 for (
int i=0;i<nummodels;i++){
147 times=xNew<IssmDouble>(N);
148 for(
int t=0;t<N;t++) times[t] = str[(M-1)*N+t];
152 for(
int j=0;j<elements->
Size();j++){
159 int *vertexlids = xNew<int>(numvertices);
160 int *vertexsids = xNew<int>(numvertices);
165 for(
int k=0;k<numvertices;k++){
166 vertexsids[k] =reCast<int>(iomodel->
elements[numvertices*element->
Sid()+k]);
172 IssmDouble* values=xNew<IssmDouble>(numvertices);
174 for(
int t=0;t<N;t++){
175 for (
int k=0;k<numvertices;k++)values[k]=str[N*vertexsids[k]+t];
180 default:
_error_(
"Not implemented yet");
183 xDelete<IssmDouble>(values);
184 xDelete<int>(vertexlids);
185 xDelete<int>(vertexsids);
188 xDelete<IssmDouble>(times);
192 for(
int i=0;i<nummodels;i++){
194 xDelete<IssmDouble>(str);
196 xDelete<IssmDouble*>(pstr);
201 iomodel->
FetchData(&pstr,&pM,&pN,&nummodels,
"md.dsl.sea_water_pressure_change_at_sea_floor");
203 for (
int i=0;i<nummodels;i++){
209 times=xNew<IssmDouble>(N);
210 for(
int t=0;t<N;t++) times[t] = str[(M-1)*N+t];
214 for(
int j=0;j<elements->
Size();j++){
221 int *vertexlids = xNew<int>(numvertices);
222 int *vertexsids = xNew<int>(numvertices);
227 for(
int k=0;k<numvertices;k++){
228 vertexsids[k] =reCast<int>(iomodel->
elements[numvertices*element->
Sid()+k]);
234 IssmDouble* values=xNew<IssmDouble>(numvertices);
236 for(
int t=0;t<N;t++){
237 for (
int k=0;k<numvertices;k++)values[k]=str[N*vertexsids[k]+t];
242 default:
_error_(
"Not implemented yet");
245 xDelete<IssmDouble>(values);
246 xDelete<int>(vertexlids);
247 xDelete<int>(vertexsids);
249 xDelete<IssmDouble>(times);
253 for(
int i=0;i<nummodels;i++){
255 xDelete<IssmDouble>(str);
257 xDelete<IssmDouble*>(pstr);
263 else _error_(
"Dsl model " << dslmodel <<
" not implemented yet!");
295 int M,m,lower_row,upper_row;
301 char** requestedoutputs = NULL;
305 int *transitions_M = NULL;
306 int *transitions_N = NULL;
327 iomodel->
FetchData(&planetradius,
"md.solidearth.planetradius");
328 planetarea=4*
PI*planetradius*planetradius;
332 iomodel->
FetchData(&dslmodel,
"md.dsl.model");
340 iomodel->
FetchData(&modelid,
"md.dsl.modelid");
341 iomodel->
FetchData(&nummodels,
"md.dsl.nummodels");
344 if(nummodels<=0)
_error_(
"dslmme object in md.dsl field should contain at least 1 ensemble model!");
345 if(modelid<=0 || modelid>nummodels)
_error_(
"modelid field in dslmme object of md.dsl field should be between 1 and the number of ensemble runs!");
349 iomodel->
FetchData(&love_h,&nl,NULL,
"md.solidearth.lovenumbers.h");
350 iomodel->
FetchData(&love_k,&nl,NULL,
"md.solidearth.lovenumbers.k");
351 iomodel->
FetchData(&love_l,&nl,NULL,
"md.solidearth.lovenumbers.l");
352 iomodel->
FetchData(&love_th,&nl,NULL,
"md.solidearth.lovenumbers.th");
353 iomodel->
FetchData(&love_tk,&nl,NULL,
"md.solidearth.lovenumbers.tk");
354 iomodel->
FetchData(&love_tl,&nl,NULL,
"md.solidearth.lovenumbers.tl");
365 iomodel->
FetchData(°acc,
"md.solidearth.settings.degacc");
366 M=reCast<int,IssmDouble>(180./degacc+1.);
371 G_rigid=xNew<IssmDouble>(M,
"t");
372 G_elastic=xNew<IssmDouble>(M,
"t");
373 U_elastic=xNew<IssmDouble>(M,
"t");
374 H_elastic=xNew<IssmDouble>(M,
"t");
376 G_rigid=xNew<IssmDouble>(M);
377 G_elastic=xNew<IssmDouble>(M);
378 U_elastic=xNew<IssmDouble>(M);
379 H_elastic=xNew<IssmDouble>(M);
388 G_elastic_local=xNew<IssmDouble>(m,
"t");
389 G_rigid_local=xNew<IssmDouble>(m,
"t");
390 U_elastic_local=xNew<IssmDouble>(m,
"t");
391 H_elastic_local=xNew<IssmDouble>(m,
"t");
393 G_elastic_local=xNew<IssmDouble>(m);
394 G_rigid_local=xNew<IssmDouble>(m);
395 U_elastic_local=xNew<IssmDouble>(m);
396 H_elastic_local=xNew<IssmDouble>(m);
399 for(
int i=lower_row;i<upper_row;i++){
401 alpha= reCast<IssmDouble>(i)*degacc *
PI / 180.0;
403 G_rigid_local[i-lower_row]= .5/sin(
alpha/2.0);
404 G_elastic_local[i-lower_row]= (love_k[nl-1]-love_h[nl-1])*G_rigid_local[i-lower_row];
405 U_elastic_local[i-lower_row]= (love_h[nl-1])*G_rigid_local[i-lower_row];
406 H_elastic_local[i-lower_row]= 0;
414 for (
int n=0;n<nl;n++) {
418 deltalove_G = (love_k[n]-love_k[nl-1]-love_h[n]+love_h[nl-1]);
419 deltalove_U = (love_h[n]-love_h[nl-1]);
431 Pn = ( (2*n-1)*cos(
alpha)*Pn1 - (n-1)*Pn2 ) /n;
432 Pn_p = ( (2*n-1)*(Pn1+cos(
alpha)*Pn_p1) - (n-1)*Pn_p2 ) /n;
435 Pn_p2=Pn_p1; Pn_p1=Pn_p;
437 G_elastic_local[i-lower_row] += deltalove_G*Pn;
438 U_elastic_local[i-lower_row] += deltalove_U*Pn;
439 H_elastic_local[i-lower_row] += sin(
alpha)*love_l[n]*Pn_p;
459 xDelete<int>(recvcounts);
460 xDelete<int>(displs);
465 G_rigid[0]=G_rigid[1];
467 G_elastic[0]=G_elastic[1];
469 U_elastic[0]=U_elastic[1];
471 H_elastic[0]=H_elastic[1];
475 xDelete<IssmDouble>(love_h);
476 xDelete<IssmDouble>(love_k);
477 xDelete<IssmDouble>(love_l);
478 xDelete<IssmDouble>(love_th);
479 xDelete<IssmDouble>(love_tk);
480 xDelete<IssmDouble>(love_tl);
481 xDelete<IssmDouble>(G_rigid);
482 xDelete<IssmDouble>(G_rigid_local);
483 xDelete<IssmDouble>(G_elastic);
484 xDelete<IssmDouble>(G_elastic_local);
485 xDelete<IssmDouble>(U_elastic);
486 xDelete<IssmDouble>(U_elastic_local);
487 xDelete<IssmDouble>(H_elastic);
488 xDelete<IssmDouble>(H_elastic_local);
495 iomodel->
FetchData(&transitions,&transitions_M,&transitions_N,&ntransitions,
"md.solidearth.transitions");
499 for(
int i=0;i<ntransitions;i++){
501 xDelete<IssmDouble>(transition);
503 xDelete<IssmDouble*>(transitions);
504 xDelete<int>(transitions_M);
505 xDelete<int>(transitions_N);
508 iomodel->
FindConstant(&requestedoutputs,&numoutputs,
"md.solidearth.requested_outputs");
510 iomodel->
DeleteData(&requestedoutputs,numoutputs,
"md.solidearth.requested_outputs");
527 _error_(
"not implemented yet");
530 _error_(
"not implemented yet");
533 _error_(
"not implemented yet");
536 _error_(
"Not implemented yet");
539 _error_(
"not implemeneted yet!");