source: issm/trunk/src/c/main/kriging.cpp@ 15396

Last change on this file since 15396 was 15104, checked in by Mathieu Morlighem, 12 years ago

CHG: simplifying prints

File size: 5.7 KB
Line 
1/*!\file: kriging.cpp
2 * \brief: kriging main parallel program
3 */
4
5#include "./issm.h"
6
7/*Local prototypes*/
8void ProcessArguments2(char** pbinfilename,char** poutbinfilename,char** plockfilename,char** prootpath,int argc,char **argv);
9void ProcessInputfile(IssmDouble **px,IssmDouble **py,IssmDouble **pdata,int *pnobs,IssmDouble **px_interp,IssmDouble **py_interp,int *pninterp,Options **poptions,FILE* fid);
10
11int main(int argc,char **argv){
12
13 /*I/O: */
14 FILE *output_fid = NULL;
15 FILE *input_fid = NULL;
16 bool waitonlock = false;
17
18 /*File names*/
19 char *lockfilename = NULL;
20 char *binfilename = NULL;
21 char *outbinfilename = NULL;
22 char *rootpath = NULL;
23
24 MPI_Comm comm;
25
26 /*Input*/
27 int ninterp,nobs;
28 IssmDouble *x = NULL;
29 IssmDouble *y = NULL;
30 IssmDouble *data = NULL;
31 IssmDouble *x_interp = NULL;
32 IssmDouble *y_interp = NULL;
33 Options *options = NULL;
34
35 /*Output*/
36 IssmDouble *predictions = NULL;
37 IssmDouble *error = NULL;
38
39 /*Initialize exception trapping: */
40 ExceptionTrapBegin();
41
42 /*Initialize environment (MPI, PETSC, MUMPS, etc ...)*/
43 comm=EnvironmentInit(argc,argv);
44 IssmComm::SetComm(comm);
45
46 ProcessArguments2(&binfilename,&outbinfilename,&lockfilename,&rootpath,argc,argv);
47
48 /*Process input files*/
49 input_fid=pfopen(binfilename,"rb");
50 ProcessInputfile(&x,&y,&data,&nobs,&x_interp,&y_interp,&ninterp,&options,input_fid);
51 pfclose(input_fid,binfilename);
52
53 _printf0_("call computational core:\n");
54 pKrigingx(&predictions,&error,x,y,data,nobs,x_interp,y_interp,ninterp,options);
55
56 _printf0_("write results to disk:\n");
57 Results *results = new Results();
58 if(IssmComm::GetRank()==0){
59 output_fid=pfopen(outbinfilename,"wb");
60 results->AddObject(new GenericExternalResult<double*>(results->Size()+1,0,predictions,ninterp,1,1,0));
61 results->AddObject(new GenericExternalResult<double*>(results->Size()+1,1,error,ninterp,1,1,0));
62 for(int i=0;i<results->Size();i++){
63 ExternalResult* result=dynamic_cast<ExternalResult*>(results->GetObjectByOffset(i));
64 result->WriteData(output_fid,1);
65 }
66 pfclose(output_fid,outbinfilename);
67 }
68
69 /*Close output and toolkits options file and write lock file if requested*/
70 _printf0_("write lock file:\n");
71 WriteLockFile(lockfilename);
72
73 /*Free ressources */
74 xDelete<char>(lockfilename);
75 xDelete<char>(binfilename);
76 xDelete<char>(outbinfilename);
77 xDelete<char>(rootpath);
78 xDelete<IssmDouble>(x);
79 xDelete<IssmDouble>(y);
80 xDelete<IssmDouble>(data);
81 xDelete<IssmDouble>(x_interp);
82 xDelete<IssmDouble>(y_interp);
83 xDelete<IssmDouble>(predictions);
84 xDelete<IssmDouble>(error);
85 delete options;
86 delete results;
87
88 /*Finalize environment:*/
89 EnvironmentFinalize();
90
91 /*Finalize exception trapping: */
92 ExceptionTrapEnd();
93
94 return 0; //unix success return;
95}
96
97void ProcessArguments2(char** pbinfilename,char** poutbinfilename,char** plockfilename,char** prootpath,int argc,char **argv){
98 char *modelname = NULL;
99 char *binfilename = NULL;
100 char *outbinfilename = NULL;
101 char *lockfilename = NULL;
102 char *rootpatharg = NULL;
103 char *rootpath = NULL;
104
105 if(argc<1)_error_("Usage error: no execution path provided");
106 if(argc<2)_error_("Usage error: missing model name");
107
108 rootpatharg=argv[1];
109 if(strcmp(strstr(rootpatharg,"/"),"/")!=0){
110 rootpath = xNew<char>(strlen(rootpatharg)+2); sprintf(rootpath,"%s/",rootpatharg);
111 }
112 else{
113 rootpath = xNew<char>(strlen(rootpatharg)+1); sprintf(rootpath,"%s",rootpatharg);
114 }
115
116 modelname=argv[2];
117 if(strstr(modelname,rootpath)==NULL){
118 binfilename = xNew<char>(strlen(rootpath)+strlen(modelname)+strlen(".bin") +1); sprintf(binfilename, "%s%s%s",rootpath,modelname,".bin");
119 outbinfilename = xNew<char>(strlen(rootpath)+strlen(modelname)+strlen(".outbin")+1); sprintf(outbinfilename,"%s%s%s",rootpath,modelname,".outbin");
120 lockfilename = xNew<char>(strlen(rootpath)+strlen(modelname)+strlen(".lock") +1); sprintf(lockfilename, "%s%s%s",rootpath,modelname,".lock");
121 }
122 else{
123 binfilename = xNew<char>(strlen(modelname)+strlen(".bin") +1); sprintf(binfilename, "%s%s",modelname,".bin");
124 outbinfilename = xNew<char>(strlen(modelname)+strlen(".outbin")+1); sprintf(outbinfilename,"%s%s",modelname,".outbin");
125 lockfilename = xNew<char>(strlen(modelname)+strlen(".lock") +1); sprintf(lockfilename, "%s%s",modelname,".lock");
126 }
127
128 /*Clean up and assign output pointer*/
129 *pbinfilename=binfilename;
130 *poutbinfilename=outbinfilename;
131 *plockfilename=lockfilename;
132 *prootpath=rootpath;
133}
134
135void ProcessInputfile(IssmDouble **px,IssmDouble **py,IssmDouble **pdata,int *pnobs,IssmDouble **px_interp,IssmDouble **py_interp,int *pninterp,Options **poptions,FILE* fid){
136
137 int ninterp,nobs,numoptions;
138 IssmDouble *x = NULL;
139 IssmDouble *y = NULL;
140 IssmDouble *data = NULL;
141 IssmDouble *x_interp = NULL;
142 IssmDouble *y_interp = NULL;
143 Options *options = NULL;
144 Option *option = NULL;
145
146 int M,N;
147 IoModel* iomodel = new IoModel();
148 iomodel->fid=fid;
149 iomodel->CheckEnumSync();
150 iomodel->independents=xNew<bool>(MaximumNumberOfEnums); for(int i=0;i<MaximumNumberOfEnums;i++) iomodel->independents[i]=false;
151 iomodel->FetchData(&x,&M,&N,0); nobs=M*N;
152 iomodel->FetchData(&y,&M,&N,1); _assert_(M*N==nobs);
153 iomodel->FetchData(&data,&M,&N,2); _assert_(M*N==nobs);
154 iomodel->FetchData(&x_interp,&M,&N,3); ninterp=M*N;
155 iomodel->FetchData(&y_interp,&M,&N,4); _assert_(M*N==ninterp);
156
157 /*Read options*/
158 options = new Options();
159 iomodel->LastIndex(&N);
160 numoptions=(int)((N-4)/2);
161 for(int i=0;i<numoptions;i++){
162 iomodel->FetchData(&option,5+2*i);
163 options->AddOption(option);
164 option=NULL;
165 }
166
167 /*Assign output pointer*/
168 *px = x;
169 *py = y;
170 *pdata = data;
171 *pnobs = nobs;
172 *px_interp = x_interp;
173 *py_interp = y_interp;
174 *pninterp = ninterp;
175 *poptions = options;
176 delete iomodel;
177}
Note: See TracBrowser for help on using the repository browser.