Ice Sheet System Model  4.18
Code documentation
IssmParallelDirectApplicInterface.cpp
Go to the documentation of this file.
1 
3 /*Issm Configuration: {{{*/
4 #ifdef HAVE_CONFIG_H
5 #include <config.h>
6 #else
7 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
8 #endif
9 /*}}}*/
10 
11 #if !defined(_WRAPPERS_) && defined(_HAVE_DAKOTA_) && _DAKOTA_MAJOR_ >= 6
12 
13 #include "../classes.h"
14 #include "../../cores/cores.h"
15 #include "../../modules/modules.h"
16 
17 namespace SIM {
18  IssmParallelDirectApplicInterface::IssmParallelDirectApplicInterface(const Dakota::ProblemDescDB& problem_db, const MPI_Comm& evaluation_comm, int argc, char** argv) :Dakota::DirectApplicInterface(problem_db){ /*{{{*/
19 
20  int world_rank;
22 
23  /*Build an femmodel if you are a slave, using the corresponding communicator:*/
24  if(world_rank!=0){
25  femmodel_init= new FemModel(argc,argv,evaluation_comm);
26  femmodel_init->profiler->Start(CORE);
27  }
28 
29  }
30  /*}}}*/
31  IssmParallelDirectApplicInterface::~IssmParallelDirectApplicInterface(){ /*{{{*/
32 
33  int world_rank;
35 
36  if(world_rank!=0){
37 
38  /*Wrap up: */
39  femmodel_init->profiler->Stop(CORE);
40  femmodel_init->CleanUp(); //only close file pointers on rank 0 of slave 1!
41 
42  /*Delete Model: */
43  delete femmodel_init;
44  }
45  }
46  /*}}}*/
47  int IssmParallelDirectApplicInterface::derived_map_ac(const Dakota::String& ac_name){/*{{{*/
48 
50 
51  char **responses_descriptors = NULL; //these are ours! there are only numresponsedescriptors of them, not d_numresponses!!!
52  char *response_descriptor = NULL;
53  int numresponsedescriptors;
54  int solution_type;
55  bool control_analysis = false;
56  void (*solutioncore)(FemModel*) = NULL;
57  bool nodakotacore = true;
58 
59  int world_rank;
61 
62  /*Only have slaves work!:*/
63  if(world_rank==0)return 0;
64 
65  #ifdef MPI_DEBUG
66  _printf0_("eval server id" << evalServerId << " invoking " << ac_name << " within SIM::IssmParallelDirectApplicInterface." << std::endl);
67  _printf0_("evalServerId " << evalServerId << "evaluation_id " << currEvalId << "\n");
68  #endif // MPI_DEBUG
69 
70  int i;
71  IssmDouble *variables = NULL;
72  char **variable_descriptors = NULL;
73  char *variable_descriptor = NULL;
74  IssmDouble *responses = NULL;
75 
76  /*Before launching evaluation, we need to transfer the dakota inputs into Issm readable variables: */
77 
78  /*First, the variables: */
79  variables=xNew<IssmDouble>(numACV);
80  for(i=0;i<numACV;i++){
81  variables[i]=xC[i];
82  }
83  /*The descriptors: */
84  variable_descriptors=xNew<char*>(numACV);
85  for(i=0;i<numACV;i++){
86  std::string label=xCLabels[i];
87  variable_descriptor=xNew<char>(strlen(label.c_str())+1);
88  memcpy(variable_descriptor,label.c_str(),(strlen(label.c_str())+1)*sizeof(char));
89 
90  variable_descriptors[i]=variable_descriptor;
91  }
92 
93  /*Initialize responses: */
94  responses=xNewZeroInit<IssmDouble>(numFns);
95 
96  /*Hack:*/
97  for(int i=0;i<femmodel_init->nummodels;i++) if(femmodel_init->analysis_type_list[i]==SealevelriseAnalysisEnum) sealevelrise_core_geometry(femmodel_init);
98 
99  /*Make a copy of femmodel, so we start this new evaluation run for this specific sample with a brand
100  * new copy of the model, which has not been tempered with by previous evaluation runs: */
101  femmodel=femmodel_init->copy();
102 
103  /*retrieve parameters: */
104  femmodel->parameters->FindParam(&responses_descriptors,&numresponsedescriptors,QmuResponsedescriptorsEnum);
105  femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
107 
108  /*include currEvalId in parameters:*/
110 
111  /*Modify core inputs in objects contained in femmodel, to reflect the dakota variables inputs: */
112  InputUpdateFromDakotax(femmodel,variables,variable_descriptors,numACV);
113 
114  /*Determine solution sequence: */
115  if(VerboseQmu()) _printf0_("Starting " << EnumToStringx(solution_type) << " core:\n");
116  WrapperCorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type,nodakotacore);
117 
118  /*Run the core solution sequence: */
119  solutioncore(femmodel);
120 
121  /*compute responses: */
122  if(VerboseQmu()) _printf0_("compute dakota responses:\n");
123  femmodel->DakotaResponsesx(responses,responses_descriptors,numresponsedescriptors,numFns);
124 
125  /*Output results for this iteration: */
126  if(VerboseQmu()) _printf0_("output results for this iteration: \n");
128 
129  /*populate responses: */
130  for(i=0;i<numFns;i++){
131  fnVals[i]=responses[i];
132  }
133 
134  /*Free ressources:*/
135  xDelete<IssmDouble>(variables);
136  for(i=0;i<numACV;i++){
137  variable_descriptor=variable_descriptors[i];
138  xDelete<char>(variable_descriptor);
139  }
140  xDelete<char*>(variable_descriptors);
141  for(i=0;i<numresponsedescriptors;i++){
142  response_descriptor=responses_descriptors[i];
143  xDelete<char>(response_descriptor);
144  }
145  if(responses_descriptors) xDelete<char*>(responses_descriptors);
146  xDelete<IssmDouble>(responses);
147  delete femmodel;
148 
149  return 0;
150  }/*}}}*/
151 }
152 #endif
IssmDouble
double IssmDouble
Definition: types.h:37
OutputResultsx
void OutputResultsx(FemModel *femmodel)
Definition: OutputResultsx.cpp:17
_printf0_
#define _printf0_(StreamArgs)
Definition: Print.h:29
FemModel::parameters
Parameters * parameters
Definition: FemModel.h:46
InversionIscontrolEnum
@ InversionIscontrolEnum
Definition: EnumDefinitions.h:218
CORE
#define CORE
Definition: Profiler.h:15
VerboseQmu
bool VerboseQmu(void)
Definition: Verbosity.cpp:28
ISSM_MPI_COMM_WORLD
#define ISSM_MPI_COMM_WORLD
Definition: issmmpi.h:137
ISSM_MPI_Comm_rank
int ISSM_MPI_Comm_rank(ISSM_MPI_Comm comm, int *rank)
Definition: issmmpi.cpp:198
sealevelrise_core_geometry
void sealevelrise_core_geometry(FemModel *femmodel)
Definition: sealevelchange_core.cpp:351
Parameters::SetParam
void SetParam(bool boolean, int enum_type)
Definition: Parameters.cpp:441
EnumToStringx
const char * EnumToStringx(int enum_in)
Definition: EnumToStringx.cpp:15
QmuResponsedescriptorsEnum
@ QmuResponsedescriptorsEnum
Definition: EnumDefinitions.h:292
QmuCurrEvalIdEnum
@ QmuCurrEvalIdEnum
Definition: EnumDefinitions.h:291
SolutionTypeEnum
@ SolutionTypeEnum
Definition: EnumDefinitions.h:398
SealevelriseAnalysisEnum
@ SealevelriseAnalysisEnum
Definition: EnumDefinitions.h:1266
WrapperCorePointerFromSolutionEnum
void WrapperCorePointerFromSolutionEnum(void(**psolutioncore)(FemModel *), Parameters *parameters, int solutiontype, bool nodakotacore=false)
Definition: WrapperCorePointerFromSolutionEnum.cpp:17
FemModel
Definition: FemModel.h:31
InputUpdateFromDakotax
void InputUpdateFromDakotax(FemModel *femmodel, double *variables, char **variables_descriptors, int numdakotavariables)
Definition: InputUpdateFromDakotax.cpp:12
Parameters::FindParam
void FindParam(bool *pinteger, int enum_type)
Definition: Parameters.cpp:262
FemModel::copy
FemModel * copy()
Definition: FemModel.cpp:320
femmodel
FemModel * femmodel
Definition: esmfbinders.cpp:16