/DataAssimilation/common/data_assimilation_routines.h

http://github.com/xyan075/examples · C Header · 1398 lines · 915 code · 248 blank · 235 comment · 89 complexity · a5c27bede34902184ef0e3c81debb85c MD5 · raw file

Large files are truncated click here to view the full file

  1. //command: mpiexec -n 1 ./01 -measurement-noise-scale 0.1 -global-noise-scale 0.1 -initialization-error 100 -measurement-noise-amount 100
  2. static char help[] = "rUKF approach.\n\
  3. ... \n\n";
  4. #undef __FUNCT__
  5. #define __FUNCT__ "main"
  6. #define PETSC_OPERATIONS_DEBUG 1
  7. #include "slepcsvd.h"
  8. #include "petscksp.h"
  9. #include "petscmat.h"
  10. #include <stdlib.h>
  11. #include <assert.h>
  12. #include <gsl/gsl_errno.h>
  13. #include <gsl/gsl_spline.h>
  14. #include "data_assimilation_utility_routines.h"
  15. #define ERROR_TYPE_COMMON 1
  16. #define INFO_PETSC_INT 1
  17. #define INFO_PETSC_REAL 2
  18. #define INFO_PETSC_VEC 3
  19. #define INFO_PETSC_MAT 4
  20. #define INFO_PETSC_INTARRAY 5
  21. #define INFO_PETSC_REALARRAY 6
  22. #define FILTER_TYPE_RUKF 7
  23. #define MEAUSREMENT_TYPE_FROM_HEADER_AND_DAT_FILES 1
  24. #define DIAGNOSIS_DISP_EVERYTHING 0x8000
  25. #define DIAGNOSIS_DISP_MEDIUM 0x4000
  26. #define DIAGNOSIS_DISP_MINIMUM 0x2000
  27. #define DIAGNOSIS_DISP_INITIAL_CONF 0x0001
  28. #define app_context_assert(x,msg,app_context) {if(!(x)) app_context_report_error(ERROR_TYPE_COMMON, msg, app_context, __LINE__,__FUNCT__,__FILE__);}
  29. #ifndef MEASUREMENT_DIR
  30. #define MEASUREMENT_DIR "./" //where to find the measurement files
  31. #endif
  32. #define MAX_SIZE_PATH_NAME 256
  33. #define MAX_SIZE_FILE_NAME 128
  34. //-------------------------------------------------------------------------------------------------
  35. //---structures definitions---
  36. struct _APP_CONTEXT_TYPE{
  37. MPI_Comm mpi_comm_global;//process in the work group
  38. MPI_Comm mpi_comm_local; //this process
  39. PetscViewer pv_global;
  40. PetscViewer pv_local;
  41. PetscErrorCode ierr;
  42. PetscInt diagnosisMode;
  43. PetscReal measurement_noise_scale; // for R
  44. PetscReal global_noise_scale; // for both R and P_0
  45. // PetscReal initialization_error; // for theta_0
  46. PetscReal measurement_noise_amount; // for y_k
  47. PetscInt n_x;//ndof
  48. PetscInt n_theta; //npdof
  49. PetscReal* x_0;
  50. PetscReal x_scale_constant;
  51. PetscReal* x_scale; //currently initialized from x_scale_constant;
  52. PetscReal* theta_truth;
  53. PetscReal* theta_0;
  54. PetscReal* theta_scale;
  55. //temporary storage for computation
  56. //-SVD related
  57. Mat S_ensemble; //ensemble matrix, only for storage purpose (for doing SVD), app_context->n_x+app_context->n_theta by model->n_ensem
  58. Mat S_ensemble2; //ensemble matrix, only for storage purpose (for S_ensemble*S_ensemble2^T)
  59. Mat P_z; //BIG! error covariance for the augmented state vecotr, used by rUKF for doing SVD,app_context->n_x+app_context->n_theta by app_context->n_x+app_context->n_theta
  60. Mat S_z; //SVD result of P_z, app_context->n_x+app_context->n_theta by filter->subfilter->r
  61. Mat S_bar; //used in the measurement update by rUKF, measurement->n_y by filter->subfilter->r
  62. Mat S_bar2; //temperory storage for a matrix of the size measurement->n_y by filter->subfilter->r
  63. //-general temperory usage
  64. Mat tmp_r; // r by r matrix
  65. Mat tmp_nz_by_r;
  66. Mat tmp_r_by_ny;
  67. Vec tmp_z; //n_x+n_theta by 1 vector
  68. Vec tmp_x; //n_x by 1 vector
  69. Vec tmp_theta; //n_theta by 1 vector
  70. Vec tmp_y; //measurement->n_y by 1 vector
  71. PetscInt* tmp_x_indices;
  72. PetscInt* tmp_theta_indices;
  73. //measurement info
  74. char* measurement_dir_name;
  75. char* measurement_header_file_name;
  76. char* measurement_data_file_name;
  77. char* measurement_matrix_file_name;
  78. char* measurement_error_covariance_matrix_file_name;
  79. int measurementType;
  80. };
  81. typedef struct _APP_CONTEXT_TYPE APP_CONTEXT_TYPE;
  82. struct _MODEL_TYPE{
  83. struct _MODEL_TYPE* (*f)(struct _MODEL_TYPE*, APP_CONTEXT_TYPE*); //f: model forward operator : n (number of ensembles) states at k --> n states at k+1 (n>=1)
  84. PetscInt n_x;//ndof
  85. PetscInt n_theta;
  86. PetscInt n_z;
  87. Vec x_k_hat;
  88. Vec theta_k_hat;
  89. Vec x_k_minus_1_hat;
  90. Vec theta_k_minus_1_hat;
  91. PetscInt k; //time step
  92. PetscReal t; //time
  93. PetscInt n_ensem; //number of ensembles
  94. Vec* x_k_minus_1;
  95. Vec* theta_k_minus_1;
  96. Vec* x_k;
  97. Vec* theta_k;
  98. // measurementDisplacementScale=[];
  99. //ipfibreNums=[];
  100. //fixed_contractility_factor=[];
  101. //phase=[];
  102. //Cai_i_max=[];
  103. //parameter_permutation_matrx =[];
  104. //repeatScaleFacotrs =[];
  105. //repeatNumber=[];
  106. };
  107. typedef struct _MODEL_TYPE MODEL_TYPE;
  108. struct _FILTER_SUBTYPE{
  109. PetscInt filter_type;
  110. PetscInt r; //rank ( r>=(n_theat>0)?n_theat:n_x, r<= n_theta+n_x;
  111. Mat P_x; //BIG! error covariance for the state vecotr, not used by rUKF
  112. Mat P_theta; //error covariance for the parameter vector, not used by rUKF
  113. Mat S_x; //square-root of P_x
  114. Mat S_theta; //square-root of P_theta
  115. };
  116. typedef struct _FILTER_SUBTYPE FILTER_SUBTYPE;
  117. struct _FILTER_TYPE{
  118. PetscInt n_x; //ndof, n_x>=0
  119. PetscInt n_theta; //ndof, n_theta>=0
  120. PetscInt n_z;
  121. Mat K; //Kalman gain matrix, n_x + n_theta by measurement->n_y
  122. // Vec x;
  123. // Vec theta;
  124. // PetscInt filter_type;
  125. FILTER_SUBTYPE* subfilter; //FILTER_SUBTYPE
  126. };
  127. typedef struct _FILTER_TYPE FILTER_TYPE;
  128. struct _OPTIMIZER_TYPE{
  129. PetscInt n_theta; //ndof
  130. };
  131. typedef struct _OPTIMIZER_TYPE OPTIMIZER_TYPE;
  132. struct _MEAUSREMENT_TYPE{
  133. //Vec k_y;
  134. //Vec t_y;
  135. Vec y; //measurement_petsc_vector, current measurement in use(maybe interpolated), n_y by 1
  136. Mat H; //measurement matrix, n_y by n_z
  137. Mat R_d; //measurement error covariance, n_y by n_y
  138. Mat inv_R_d; //measurement error covariance inverse, n_y by n_y
  139. int n_y;//length of single measurement vector
  140. int n_z;//length of state vector
  141. int K; //number of measurements
  142. int nMeta; //default 2
  143. double* map_index2time; //nMeta(2, index, time) by K
  144. double* all_measurements; //n_y by K
  145. double* single_measurement; //n_y by 1
  146. double* H_values; //n_y by n_z;
  147. double* R_d_values;//n_y by n_y
  148. // Vec theta_y; //ground-truth parameter
  149. //xiCoordsFileName=[];
  150. //sampleType=[];
  151. //nSampleOrder=[];
  152. //elementsID=[];
  153. //facesID=[];
  154. //tempDirID =[];
  155. //experimentID =[];
  156. };
  157. typedef struct _MEAUSREMENT_TYPE MEAUSREMENT_TYPE;
  158. //-------------------------------------------------------------------------------------------------
  159. //---all routines---
  160. PetscErrorCode
  161. app_context_report_error(PetscErrorCode errorcode, const char* msg, APP_CONTEXT_TYPE* app_context, int lineNum, const char* funct, const char* file);
  162. PetscErrorCode
  163. app_context_report_info(PetscInt info_type, PetscInt info_size, void* info, const char* msg, APP_CONTEXT_TYPE* app_context);
  164. int
  165. app_context_destroy_and_finalize(APP_CONTEXT_TYPE* app_context);
  166. APP_CONTEXT_TYPE*
  167. app_context_create_and_initialize(int argc,char **args);
  168. MODEL_TYPE*
  169. model_create_and_initialize(MODEL_TYPE* (*model_opeartor)(MODEL_TYPE*, APP_CONTEXT_TYPE*), APP_CONTEXT_TYPE* app_context);
  170. MODEL_TYPE*
  171. model_set_opeartor_and_intial_condition(MODEL_TYPE* model, MODEL_TYPE* (*model_opeartor)(MODEL_TYPE*, APP_CONTEXT_TYPE*), APP_CONTEXT_TYPE* app_context);
  172. FILTER_TYPE*
  173. filter_create_and_initialize(APP_CONTEXT_TYPE* app_context,MODEL_TYPE* model);
  174. FILTER_TYPE*
  175. filter_set_intial_condition(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context);
  176. OPTIMIZER_TYPE*
  177. optimizer_create_and_initialize(APP_CONTEXT_TYPE* app_context);
  178. OPTIMIZER_TYPE*
  179. optimizer_set_intial_condition(OPTIMIZER_TYPE* optimizer, APP_CONTEXT_TYPE* app_context);
  180. //create and initialize the filter
  181. FILTER_SUBTYPE*
  182. filter_subtype_create_and_initialize(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context);
  183. // Initialize the filter subtype
  184. // PetscInt filter_type;
  185. // PetscInt r; //rank ( r>=(n_theat>0)?n_theat:1, r<= n_theta+n_x;
  186. // Mat S_x;
  187. // Mat S_theta;
  188. FILTER_SUBTYPE*
  189. filter_subtype_set_intial_condition(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context);
  190. //-------------------------------------------------------------------------------------------------
  191. //---app_context routines---
  192. PetscErrorCode
  193. app_context_report_error(PetscErrorCode errorcode, const char* msg, APP_CONTEXT_TYPE* app_context, int lineNum, const char* funct, const char* file)
  194. {
  195. static int previous_lineNum=0;
  196. if(errorcode){
  197. PetscPrintf(app_context->mpi_comm_global, "== fatal error: %s: at line %d, function %s(), file %s. prevous line number: %d \n", msg, lineNum, funct, file,previous_lineNum);
  198. //CHKERRQ(app_context->ierr); //if errorcode is non-zero,
  199. SETERRQ(errorcode,msg);
  200. }else{
  201. previous_lineNum = lineNum;
  202. return 0;
  203. }
  204. }
  205. PetscErrorCode
  206. app_context_report_info(PetscInt info_type, PetscInt info_size, void* info, const char* msg, APP_CONTEXT_TYPE* app_context)
  207. {
  208. app_context->ierr = PetscPrintf(app_context->mpi_comm_global, "== info: %s: ", msg);
  209. //app_context_report_error(app_context->ierr,"app_context_report_info: PetscPrintf",app_context,__LINE__,__FUNCT__,__FILE__);
  210. switch(info_type)
  211. {
  212. case INFO_PETSC_INT:
  213. case INFO_PETSC_INTARRAY:
  214. app_context->ierr = PetscIntView(info_size, (PetscInt*)info, app_context->pv_global);
  215. app_context_report_error(app_context->ierr,"app_context_report_info: INFO_PETSC_INT",app_context,__LINE__,__FUNCT__,__FILE__);
  216. break;
  217. case INFO_PETSC_REAL:
  218. case INFO_PETSC_REALARRAY:
  219. app_context->ierr = PetscRealView(info_size, (PetscReal*)info, app_context->pv_global);
  220. app_context_report_error(app_context->ierr,"app_context_report_info: INFO_PETSC_REAL",app_context,__LINE__,__FUNCT__,__FILE__);
  221. break;
  222. case INFO_PETSC_VEC:
  223. app_context->ierr = PetscPrintf(app_context->mpi_comm_global, "\n", msg);
  224. app_context_report_error(app_context->ierr,"app_context_report_info: INFO_PETSC_VEC",app_context,__LINE__,__FUNCT__,__FILE__);
  225. app_context->ierr = VecView( *((Vec*)info), app_context->pv_global);
  226. app_context_report_error(app_context->ierr,"app_context_report_info: INFO_PETSC_VEC",app_context,__LINE__,__FUNCT__,__FILE__);
  227. break;
  228. case INFO_PETSC_MAT:
  229. app_context->ierr = PetscPrintf(app_context->mpi_comm_global, "\n", msg);
  230. app_context_report_error(app_context->ierr,"app_context_report_info: INFO_PETSC_MAT",app_context,__LINE__,__FUNCT__,__FILE__);
  231. app_context->ierr = MatView( *((Mat*)info), app_context->pv_global);
  232. app_context_report_error(app_context->ierr,"app_context_report_info: INFO_PETSC_MAT",app_context,__LINE__,__FUNCT__,__FILE__);
  233. break;
  234. default:
  235. app_context->ierr = PetscPrintf(app_context->mpi_comm_global, "== wrong info_type: %d\n", info_type);
  236. app_context_report_error(app_context->ierr,"app_context_report_info: default",app_context,__LINE__,__FUNCT__,__FILE__);
  237. break;
  238. }
  239. app_context->ierr = PetscPrintf(app_context->mpi_comm_global, "\n");
  240. app_context_report_error(app_context->ierr,"app_context_report_info: PetscPrintf",app_context,__LINE__,__FUNCT__,__FILE__);
  241. return 0;
  242. }
  243. APP_CONTEXT_TYPE*
  244. app_context_create_and_initialize(int argc,char **args)
  245. {
  246. APP_CONTEXT_TYPE* app_context = NULL;
  247. PetscTruth flg = PETSC_FALSE, flg_1=PETSC_FALSE;
  248. int i=0;
  249. // char options[2][PETSC_MAX_PATH_LEN]; /* input file name */
  250. //app_context->ierr = PetscMalloc(sizeof(APP_CONTEXT_TYPE), (void **) &app_context);
  251. app_context = (APP_CONTEXT_TYPE*) malloc(sizeof(APP_CONTEXT_TYPE));
  252. if(app_context==NULL){
  253. PetscPrintf(MPI_COMM_WORLD, "== fatal error: app_context_create_and_initialize: app_context==NULL");
  254. PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,ERROR_TYPE_COMMON,1,"app_context_create_and_initialize: app_context==NULL");
  255. return NULL;
  256. }
  257. //app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscMalloc",app_context);
  258. //program initialization
  259. // PetscInitialize(&argc,&args,(char *)0,help);
  260. SlepcInitialize(&argc,&args,(char*)0,(char*) 0);
  261. app_context->mpi_comm_local=MPI_COMM_SELF;
  262. app_context->mpi_comm_global=MPI_COMM_WORLD;
  263. app_context->pv_global=PETSC_VIEWER_STDOUT_WORLD;
  264. app_context->pv_local=PETSC_VIEWER_STDOUT_SELF;
  265. PetscViewerSetFormat(app_context->pv_local, PETSC_VIEWER_ASCII_MATLAB) ; //PETSC_VIEWER_ASCII_INDEX);
  266. PetscViewerSetFormat(app_context->pv_global, PETSC_VIEWER_ASCII_MATLAB) ;//PETSC_VIEWER_ASCII_INDEX);
  267. // --- program parameter initialization ----
  268. //default values
  269. app_context->diagnosisMode = DIAGNOSIS_DISP_INITIAL_CONF | DIAGNOSIS_DISP_EVERYTHING;
  270. app_context->measurement_noise_scale = 0.25;
  271. app_context->global_noise_scale = 0.0001;
  272. // app_context->initialization_error = 0.5;
  273. app_context->measurement_noise_amount = 0.0;
  274. app_context->n_x = 2;
  275. app_context->x_scale_constant=1.0;
  276. PetscMalloc(sizeof(PetscReal)*app_context->n_x, (void**) &app_context->x_0);
  277. app_context->x_0[0] = 1.0;
  278. app_context->x_0[1] = 1.0;
  279. app_context->n_theta = 2 ;
  280. PetscMalloc(sizeof(PetscReal)*app_context->n_theta, (void**) &app_context->theta_truth);
  281. app_context->theta_truth[0] = 1.0;
  282. app_context->theta_truth[1] = 1.0;
  283. PetscMalloc(sizeof(PetscReal)*app_context->n_theta, (void**) &app_context->theta_0);
  284. app_context->theta_0[0] = 1.5;
  285. app_context->theta_0[1] = 0.5;
  286. PetscMalloc(sizeof(PetscReal)*app_context->n_theta, (void**) &app_context->theta_scale);
  287. app_context->theta_scale[0] = 1.0;
  288. app_context->theta_scale[1] = 1.0;
  289. //user-defined values
  290. app_context->ierr = PetscOptionsGetReal(PETSC_NULL,"-measurement-noise-scale",&app_context->measurement_noise_scale,&flg);
  291. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetReal",app_context,__LINE__,__FUNCT__,__FILE__);
  292. app_context->ierr = PetscOptionsGetReal(PETSC_NULL,"-global-noise-scale",&app_context->global_noise_scale,&flg);
  293. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetReal",app_context,__LINE__,__FUNCT__,__FILE__);
  294. // app_context->ierr = PetscOptionsGetReal(PETSC_NULL,"-initialization-error",&app_context->initialization_error,&flg);
  295. // app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetReal",app_context,__LINE__,__FUNCT__,__FILE__);
  296. app_context->ierr = PetscOptionsGetReal(PETSC_NULL,"-measurement-noise-amount",&app_context->measurement_noise_amount,&flg);
  297. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetReal",app_context,__LINE__,__FUNCT__,__FILE__);
  298. //app_context->x_0
  299. app_context->ierr = PetscOptionsGetInt(PETSC_NULL,"-n-x",&app_context->n_x,&flg);
  300. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetInt",app_context,__LINE__,__FUNCT__,__FILE__);
  301. if(flg){ //resize the array
  302. PetscFree(app_context->x_0);
  303. app_context->ierr=PetscMalloc(sizeof(PetscReal)*app_context->n_x, (void **) &app_context->x_0);
  304. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscMalloc",app_context,__LINE__,__FUNCT__,__FILE__);
  305. }
  306. flg_1 = flg;
  307. PetscOptionsHasName(PETSC_NULL,"-x-0",&flg);
  308. if( flg_1 | flg ){
  309. app_context_report_error(ERROR_TYPE_COMMON,"app_context_create_and_initialize: -n-x and -x_0 should be given together",app_context,__LINE__,__FUNCT__,__FILE__);
  310. }
  311. PetscOptionsHasName(PETSC_NULL,"-x-0",&flg);
  312. if(flg){
  313. app_context->ierr = PetscOptionsGetRealArray(PETSC_NULL,"-x-0",app_context->x_0, &app_context->n_x,&flg);
  314. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetInt",app_context,__LINE__,__FUNCT__,__FILE__);
  315. }
  316. //x_scale_constant
  317. app_context->ierr = PetscOptionsGetReal(PETSC_NULL,"-x-scale",&app_context->x_scale_constant, &flg);
  318. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetReal x_scale",app_context,__LINE__,__FUNCT__,__FILE__);
  319. //x-scale
  320. app_context->ierr = PetscMalloc(sizeof(PetscReal)*app_context->n_x, (void **) &app_context->x_scale);
  321. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscMalloc",app_context,__LINE__,__FUNCT__,__FILE__);
  322. for(i=0; i<app_context->n_x; i++)
  323. app_context->x_scale[i]=app_context->x_scale_constant;
  324. //app_context->theta_truth
  325. app_context->ierr = PetscOptionsGetInt(PETSC_NULL,"-n-theta-truth",&app_context->n_theta,&flg);
  326. app_context_assert(app_context->n_theta>=0, "", app_context);
  327. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetInt",app_context,__LINE__,__FUNCT__,__FILE__);
  328. if(flg){ //resize the array
  329. PetscFree(app_context->x_0);
  330. PetscMalloc(sizeof(PetscReal)*app_context->n_theta, (void **) &app_context->theta_truth);
  331. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscMalloc",app_context,__LINE__,__FUNCT__,__FILE__);
  332. }
  333. flg_1 = flg;
  334. PetscOptionsHasName(PETSC_NULL,"-theta-truth",&flg);
  335. if( app_context->n_theta>0 && (flg_1 | flg) ){
  336. app_context_report_error(ERROR_TYPE_COMMON,"app_context_create_and_initialize: -n-theta-truth and -theta_truth should be given together",app_context,__LINE__,__FUNCT__,__FILE__);
  337. }
  338. if(app_context->n_theta>0 && flg){
  339. app_context->ierr = PetscOptionsGetRealArray(PETSC_NULL,"-theta-truth",app_context->theta_truth,&app_context->n_theta, &flg);
  340. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetRealArray",app_context,__LINE__,__FUNCT__,__FILE__);
  341. }
  342. //app_context->theta_0
  343. app_context->ierr = PetscOptionsGetInt(PETSC_NULL,"-n-theta-0",&app_context->n_theta,&flg);
  344. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetInt",app_context,__LINE__,__FUNCT__,__FILE__);
  345. if(flg){ //resize the array
  346. if(app_context->n_theta != sizeof(app_context->theta_truth)/sizeof(PetscReal))
  347. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: -n-theta-0 is different from -n-theta-truth",app_context,__LINE__,__FUNCT__,__FILE__);
  348. PetscFree(app_context->x_0);
  349. PetscMalloc(sizeof(PetscReal)*app_context->n_theta, (void **) &app_context->theta_0);
  350. }
  351. flg_1 = flg;
  352. PetscOptionsHasName(PETSC_NULL,"-theta-0",&flg);
  353. if( flg_1 | flg ){
  354. app_context_report_error(ERROR_TYPE_COMMON,"app_context_create_and_initialize: -n-theta-0 and -theta_0 should be given together",app_context,__LINE__,__FUNCT__,__FILE__);
  355. }
  356. if(flg){
  357. app_context->ierr = PetscOptionsGetRealArray(PETSC_NULL,"-theta-0",app_context->theta_0,&app_context->n_theta, &flg);
  358. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetIntArray",app_context,__LINE__,__FUNCT__,__FILE__);
  359. }
  360. //app_context->theta_scale
  361. app_context->ierr = PetscOptionsGetInt(PETSC_NULL,"-n-theta-scale",&app_context->n_theta,&flg);
  362. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetInt",app_context,__LINE__,__FUNCT__,__FILE__);
  363. if(flg){ //resize the array
  364. if(app_context->n_theta != sizeof(app_context->theta_truth)/sizeof(PetscReal))
  365. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: -n-theta-scale is different from -n-theta",app_context,__LINE__,__FUNCT__,__FILE__);
  366. PetscFree(app_context->theta_scale);
  367. PetscMalloc(sizeof(PetscReal)*app_context->n_theta, (void **) &app_context->theta_scale);
  368. }
  369. flg_1 = flg;
  370. PetscOptionsHasName(PETSC_NULL,"-theta-scale",&flg);
  371. if( flg_1 | flg ){
  372. app_context_report_error(ERROR_TYPE_COMMON,"app_context_create_and_initialize: n_theta_scale and -theta-scale should be given together",app_context,__LINE__,__FUNCT__,__FILE__);
  373. }
  374. if(flg){
  375. app_context->ierr = PetscOptionsGetRealArray(PETSC_NULL,"-theta-scale",app_context->theta_scale,&app_context->n_theta, &flg);
  376. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetRealArray",app_context,__LINE__,__FUNCT__,__FILE__);
  377. }
  378. //echo configuration information
  379. if(app_context->diagnosisMode & DIAGNOSIS_DISP_INITIAL_CONF){
  380. app_context->ierr = app_context_report_info(INFO_PETSC_REAL,1, &app_context->measurement_noise_scale,"measurement_noise_scale", app_context);
  381. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  382. app_context->ierr = app_context_report_info(INFO_PETSC_REAL,1, &app_context->global_noise_scale,"global_noise_scale", app_context);
  383. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  384. //app_context->ierr = app_context_report_info(INFO_PETSC_REAL,1, &app_context->initialization_error,"initialization_error", app_context);
  385. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  386. app_context->ierr = app_context_report_info(INFO_PETSC_INT,1, &app_context->n_x,"n_x", app_context);
  387. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  388. app_context->ierr = app_context_report_info(INFO_PETSC_REALARRAY, app_context->n_x, app_context->x_0,"x_0", app_context);
  389. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  390. app_context->ierr = app_context_report_info(INFO_PETSC_REALARRAY, app_context->n_x, app_context->x_scale,"x_scale", app_context);
  391. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  392. app_context->ierr = app_context_report_info(INFO_PETSC_INT,1, &app_context->n_theta,"n_theta", app_context);
  393. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  394. app_context->ierr = app_context_report_info(INFO_PETSC_REALARRAY, app_context->n_theta, app_context->theta_truth,"theta_truth", app_context);
  395. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  396. app_context->ierr = app_context_report_info(INFO_PETSC_REALARRAY, app_context->n_theta, app_context->theta_0,"theta_0", app_context);
  397. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  398. app_context->ierr = app_context_report_info(INFO_PETSC_REALARRAY, app_context->n_theta, app_context->theta_scale,"theta_scale", app_context);
  399. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  400. }
  401. //--allocate temp space
  402. VecCreate(app_context->mpi_comm_global, &app_context->tmp_x);
  403. VecCreate(app_context->mpi_comm_global, &app_context->tmp_theta);
  404. VecCreate(app_context->mpi_comm_global, &app_context->tmp_z);
  405. VecSetSizes(app_context->tmp_x, PETSC_DECIDE,app_context->n_x);
  406. VecSetSizes(app_context->tmp_theta, PETSC_DECIDE,app_context->n_theta);
  407. VecSetSizes(app_context->tmp_z, PETSC_DECIDE,app_context->n_x+app_context->n_theta);
  408. app_context->ierr=PetscMalloc(sizeof(PetscInt)*app_context->n_x, &app_context->tmp_x_indices);
  409. app_context_report_error(app_context->ierr,"PetscMalloc: app_context->tmp_x_indices",app_context,__LINE__,__FUNCT__,__FILE__);
  410. app_context->ierr=PetscMalloc(sizeof(PetscInt)*app_context->n_theta, &app_context->tmp_theta_indices);
  411. app_context_report_error(app_context->ierr,"PetscMalloc: app_context->tmp_theta_indices",app_context,__LINE__,__FUNCT__,__FILE__);
  412. VecSetFromOptions(app_context->tmp_x);
  413. VecSetFromOptions(app_context->tmp_theta);
  414. VecSetFromOptions(app_context->tmp_z);
  415. //measurement
  416. app_context->measurement_dir_name = new char[MAX_SIZE_PATH_NAME+1];
  417. app_context->measurement_data_file_name = new char[MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME+1];
  418. app_context->measurement_header_file_name = new char[MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME+1];
  419. app_context->measurement_matrix_file_name = new char[MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME+1];
  420. app_context->measurement_error_covariance_matrix_file_name = new char[MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME+1];
  421. PetscOptionsGetString(PETSC_NULL,"-measurement_dir_name", app_context->measurement_dir_name,MAX_SIZE_PATH_NAME,&flg);
  422. if(flg==PETSC_FALSE) sprintf(app_context->measurement_dir_name, "%smeasurement/", MEASUREMENT_DIR);
  423. PetscOptionsGetString(PETSC_NULL,"-measurement_header_file_name", app_context->measurement_header_file_name,MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME,&flg);
  424. if(flg==PETSC_FALSE)
  425. sprintf(app_context->measurement_header_file_name, "%sheader", app_context->measurement_dir_name);
  426. else if(!strchr(app_context->measurement_header_file_name,'/'))
  427. sprintf(app_context->measurement_header_file_name, "%s%s", app_context->measurement_dir_name,app_context->measurement_header_file_name);
  428. else{}
  429. PetscOptionsGetString(PETSC_NULL,"-measurement_matrix_file_name", app_context->measurement_matrix_file_name,MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME,&flg);
  430. if(flg==PETSC_FALSE)
  431. sprintf(app_context->measurement_matrix_file_name, "%sH.dat", app_context->measurement_dir_name);
  432. else if(!strchr(app_context->measurement_matrix_file_name,'/'))
  433. sprintf(app_context->measurement_matrix_file_name, "%s%s", app_context->measurement_dir_name,app_context->measurement_matrix_file_name);
  434. else{}
  435. PetscOptionsGetString(PETSC_NULL,"-measurement_error_covariance_matrix_file_name", app_context->measurement_error_covariance_matrix_file_name,MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME,&flg);
  436. if(flg==PETSC_FALSE)
  437. sprintf(app_context->measurement_error_covariance_matrix_file_name, "%sR_d.dat", app_context->measurement_dir_name);
  438. else if(!strchr(app_context->measurement_error_covariance_matrix_file_name,'/'))
  439. sprintf(app_context->measurement_error_covariance_matrix_file_name, "%s%s", app_context->measurement_dir_name,app_context->measurement_error_covariance_matrix_file_name);
  440. else{}
  441. PetscOptionsGetInt(PETSC_NULL,"-measurementType",&app_context->measurementType,&flg);
  442. if(flg==PETSC_FALSE) app_context->measurementType=MEAUSREMENT_TYPE_FROM_HEADER_AND_DAT_FILES;
  443. return app_context;
  444. }
  445. int
  446. app_context_destroy_and_finalize(APP_CONTEXT_TYPE* app_context)
  447. {
  448. if(app_context==NULL){
  449. PetscPrintf(MPI_COMM_WORLD, "== fatal error: app_context_create_and_initialize: app_context==NULL");
  450. PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,ERROR_TYPE_COMMON,1,"app_context_finalize: app_context==NULL");
  451. return 1;
  452. }
  453. // app_context->ierr = PetscFinalize(); CHKERRQ(app_context->ierr);
  454. app_context->ierr = SlepcFinalize(); CHKERRQ(app_context->ierr);
  455. return 0;
  456. }
  457. //-------------------------------------------------------------------------------------------------
  458. //---measurement routines---
  459. //load single mesurement from .dat file with simple format: % dimension length(V) 1\n V \n
  460. // into measurement->single_measurement
  461. int
  462. measurement_io_read_single_measurement_dat(char* filename, MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  463. {
  464. int measurement_size_1 = 0, measurement_size_2 = 0;
  465. if(measurement->single_measurement) free(measurement->single_measurement);
  466. measurement->single_measurement = load_matrix_2D_ascii(filename, measurement_size_1, measurement_size_2);
  467. assert(measurement_size_2==1); assert(measurement_size_1 > 1);
  468. measurement->n_y = measurement_size_1;
  469. return 0;
  470. }
  471. //write .dat file with simple format: length(V) \n V \n
  472. int
  473. measurement_io_write_single_measurement_dat(char* filename, MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  474. {
  475. int ret = 0;
  476. if(measurement->single_measurement) ret = save_matrix_2D_ascii(filename, measurement->single_measurement, measurement->n_y, 1, NULL);
  477. assert(ret==0);
  478. return 0;
  479. }
  480. //load all meausrment into measurement data structure
  481. int
  482. measurement_io_read_all_measurements(MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  483. {
  484. int meta_info_size_1 = 0, meta_info_size_2 = 0;
  485. //header + dat files
  486. if(app_context->measurementType==MEAUSREMENT_TYPE_FROM_HEADER_AND_DAT_FILES){
  487. //load header file
  488. measurement->map_index2time = load_matrix_2D_ascii(app_context->measurement_header_file_name, meta_info_size_1, meta_info_size_2);
  489. assert(meta_info_size_1 == 2); assert(meta_info_size_2 > 2);
  490. measurement->K = meta_info_size_2;
  491. //load each measurement
  492. measurement->all_measurements = new double[measurement->n_y*measurement->K];
  493. for (int i=0; i<measurement->K; i++){
  494. sprintf(app_context->measurement_data_file_name, "%s%04d.dat", app_context->measurement_dir_name, (int)measurement->map_index2time[i*2+0]);
  495. measurement_io_read_single_measurement_dat(app_context->measurement_data_file_name, measurement, app_context);
  496. for (int j=0; j<measurement->n_y; j++) measurement->all_measurements[j*measurement->K+i]=measurement->single_measurement[j];
  497. }
  498. }
  499. return 0;
  500. }
  501. //create (Vec) measurement->y from (double*) measurement->single_measurement
  502. int
  503. measurement_petsc_vector_assemble(MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  504. {
  505. static int* index = NULL;
  506. if(index==NULL) {
  507. index = new int[measurement->n_y];
  508. VecCreate(app_context->mpi_comm_global, &measurement->y);
  509. VecSetSizes(measurement->y, PETSC_DECIDE, measurement->n_y);
  510. VecSetFromOptions(measurement->y);
  511. for (int i = 0; i<measurement->n_y; i++) index[i]=i;
  512. }
  513. app_context->ierr=VecSetValues(measurement->y,measurement->n_y, index, measurement->single_measurement,ADD_VALUES);
  514. app_context_report_error(app_context->ierr,"measurement_petsc_vector_assemble: VecSetValues",app_context,__LINE__,__FUNCT__,__FILE__);
  515. app_context->ierr=VecAssemblyBegin(measurement->y);
  516. app_context_report_error(app_context->ierr,"measurement_petsc_vector_assemble: VecAssemblyBegin",app_context,__LINE__,__FUNCT__,__FILE__);
  517. app_context->ierr=VecAssemblyEnd(measurement->y);
  518. app_context_report_error(app_context->ierr,"measurement_petsc_vector_assemble: VecAssemblyEnd",app_context,__LINE__,__FUNCT__,__FILE__);
  519. return 0;
  520. }
  521. //create (double*) measurement->single_measurement from (Vec) measurement->y
  522. int
  523. measurement_petsc_vector_disassemble(MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  524. {
  525. static int* index = NULL;
  526. if(index==NULL) {
  527. index = new int[measurement->n_y];
  528. for (int i = 0; i<measurement->n_y; i++) index[i]=i;
  529. }
  530. app_context->ierr=VecGetValues(measurement->y,measurement->n_y, index, measurement->single_measurement);
  531. app_context_report_error(app_context->ierr,"measurement_petsc_vector_disassemble: VecGetValues",app_context,__LINE__,__FUNCT__,__FILE__);
  532. app_context->ierr=VecAssemblyBegin(measurement->y);
  533. app_context_report_error(app_context->ierr,"measurement_petsc_vector_disassemble: VecAssemblyBegin",app_context,__LINE__,__FUNCT__,__FILE__);
  534. app_context->ierr=VecAssemblyEnd(measurement->y);
  535. app_context_report_error(app_context->ierr,"measurement_petsc_vector_disassemble: VecAssemblyEnd",app_context,__LINE__,__FUNCT__,__FILE__);
  536. return 0;
  537. }
  538. //initialize the interpolation for all meausrements, from all_measurements and map_index2time
  539. int
  540. measurement_interpolation_initialize(MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  541. {
  542. interp_v(0, measurement->n_y, measurement->K, &measurement->map_index2time[1*measurement->K+0], measurement->all_measurements, -1, NULL);
  543. return 0;
  544. }
  545. //finalize the interpolation for all meausrements
  546. int
  547. measurement_interpolation_finalize(MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  548. {
  549. interp_v(2, measurement->n_y, measurement->K, NULL, NULL, -1, NULL);
  550. return 0;
  551. }
  552. //get the meausrement at any given time point, stored in single_measurement
  553. int
  554. measurement_get(double time, MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  555. {
  556. if(1){ //interpolation
  557. interp_v(1, measurement->n_y, measurement->K, NULL, NULL,time, measurement->single_measurement);
  558. return 0;
  559. }
  560. }
  561. //load measurement matrix from a data file into measurement->H_values;
  562. int
  563. measurement_io_load_measurement_matrix_dat(char* filename, MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  564. {
  565. int measurement_matrix_size_1 = 0, measurement_matrix_size_2 = 0;
  566. if(measurement->H_values){PetscPrintf(app_context->mpi_comm_global, "measurement matrix was already loaded (measurement->H_values=%x), so no need to load it from %s again\n", measurement->H_values,filename); assert(0);}
  567. measurement->H_values = load_matrix_2D_ascii(filename, measurement_matrix_size_1, measurement_matrix_size_2);
  568. assert(measurement_matrix_size_2==app_context->n_x+app_context->n_theta);
  569. assert(measurement_matrix_size_1==measurement->n_y);
  570. measurement->n_z = measurement_matrix_size_2;
  571. return 0;
  572. }
  573. //load measurement error covariance matrix from a data file into measurement->R_d_values;
  574. int
  575. measurement_io_load_measurement_error_covariance_matrix_dat(char* filename, MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  576. {
  577. int measurement_matrix_size_1 = 0, measurement_matrix_size_2 = 0;
  578. if(measurement->R_d_values){PetscPrintf(app_context->mpi_comm_global, "measurement error covariance matrix was already loaded (measurement->R_d_values=%x), so no need to load it from %s again\n", measurement->R_d_values,filename); assert(0);}
  579. measurement->R_d_values = load_matrix_2D_ascii(filename, measurement_matrix_size_1, measurement_matrix_size_2);
  580. assert(measurement_matrix_size_2==measurement->n_y);
  581. assert(measurement_matrix_size_1==measurement->n_y);
  582. return 0;
  583. }
  584. //prepare measurement (IO, create petsc data structure etc.)
  585. MEAUSREMENT_TYPE*
  586. measurement_create_and_initialize(APP_CONTEXT_TYPE* app_context)
  587. {
  588. MEAUSREMENT_TYPE* measurement = new MEAUSREMENT_TYPE;
  589. memset(measurement, 0, sizeof(MEAUSREMENT_TYPE));
  590. if(0){
  591. measurement->n_y = 2;
  592. measurement->n_z = 4;
  593. measurement->single_measurement=new double[measurement->n_y];
  594. return measurement;
  595. }
  596. //load all measurements
  597. measurement_io_read_all_measurements(measurement, app_context);
  598. //load measurement matrix
  599. measurement_io_load_measurement_matrix_dat(app_context->measurement_matrix_file_name, measurement, app_context);
  600. { //create measurement->H (Mat type)
  601. int* index_row = new int[measurement->n_y];
  602. int* index_col = new int[measurement->n_z];
  603. MatCreate(app_context->mpi_comm_global, &measurement->H);
  604. MatSetSizes(measurement->H, PETSC_DECIDE, PETSC_DECIDE, measurement->n_y, measurement->n_z);
  605. MatSetFromOptions(measurement->H);
  606. for (int i = 0; i<measurement->n_y; i++) index_row[i]=i;
  607. for (int i = 0; i<measurement->n_z; i++) index_col[i]=i;
  608. app_context->ierr=MatSetValues(measurement->H,measurement->n_y,index_row,measurement->n_z, index_col,measurement->H_values,ADD_VALUES);
  609. MatAssemblyBegin(measurement->H,MAT_FINAL_ASSEMBLY);
  610. MatAssemblyEnd(measurement->H,MAT_FINAL_ASSEMBLY);
  611. app_context_report_error(app_context->ierr,"measurement_create_and_initialize: MatSetValues",app_context,__LINE__,__FUNCT__,__FILE__);
  612. free(index_row); free(index_col);
  613. }
  614. //load measurement error covariance matrix
  615. measurement_io_load_measurement_error_covariance_matrix_dat(app_context->measurement_error_covariance_matrix_file_name, measurement, app_context);
  616. { //create measurement->R_d (Mat type)
  617. int* index_row = new int[measurement->n_y];
  618. MatCreateMPIDense(app_context->mpi_comm_global, PETSC_DECIDE, PETSC_DECIDE, measurement->n_y, measurement->n_y, PETSC_NULL, &measurement->R_d);
  619. //MatCreate(app_context->mpi_comm_global, &measurement->R_d);
  620. //MatSetSizes(measurement->R_d, PETSC_DECIDE, PETSC_DECIDE, measurement->n_y, measurement->n_y);
  621. MatSetFromOptions(measurement->R_d);
  622. for (int i = 0; i<measurement->n_y; i++) index_row[i]=i;
  623. app_context->ierr=MatSetValues(measurement->R_d,measurement->n_y,index_row,measurement->n_y, index_row,measurement->R_d_values,ADD_VALUES);
  624. MatAssemblyBegin(measurement->R_d,MAT_FINAL_ASSEMBLY);
  625. MatAssemblyEnd(measurement->R_d,MAT_FINAL_ASSEMBLY);
  626. app_context_report_error(app_context->ierr,"measurement_create_and_initialize: MatSetValues",app_context,__LINE__,__FUNCT__,__FILE__);
  627. free(index_row);
  628. }
  629. //Create measurement error covariance matrix inverse inv_R_d
  630. MatDuplicate(measurement->R_d, MAT_COPY_VALUES, &measurement->inv_R_d);
  631. //prepare the interpolation
  632. measurement_interpolation_initialize(measurement, app_context);
  633. //usage:
  634. //ret = measurement_get(0, measurement, app_context);
  635. //if(ret==0) measurement_petsc_vector_assemble(measurement,app_context);
  636. //load the measurement error covariance R_d
  637. return measurement;
  638. }
  639. //-------------------------------------------------------------------------------------------------
  640. //---models routines---
  641. MODEL_TYPE*
  642. model_create_and_initialize(MODEL_TYPE* (*model_opeartor)(MODEL_TYPE*, APP_CONTEXT_TYPE* ), APP_CONTEXT_TYPE* app_context)
  643. {
  644. MODEL_TYPE* model = NULL;
  645. app_context->ierr = PetscMalloc(sizeof(MODEL_TYPE), (void**) &model);
  646. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscMalloc",app_context,__LINE__,__FUNCT__,__FILE__);
  647. model_set_opeartor_and_intial_condition(model, model_opeartor,app_context);
  648. return model;
  649. }
  650. // Initialize
  651. //1) model operator (model->f),
  652. //2) dimension (model->n_x, model->n_theta),
  653. //3) time stamp (),
  654. //4) state (model->x_k_hat,model->theta_k_hat) ,
  655. //5) previous state (model->x_k_minus_1_hat,model->theta_k_minus_1_hat)
  656. MODEL_TYPE*
  657. model_set_opeartor_and_intial_condition(MODEL_TYPE* model,MODEL_TYPE* (*model_opeartor)(MODEL_TYPE*, APP_CONTEXT_TYPE*), APP_CONTEXT_TYPE* app_context)
  658. {
  659. PetscInt i=0;
  660. if(1){ //model 01: 2 parameter, 2 state, simplest model
  661. model->f = *model_opeartor;
  662. model->k = 0;
  663. model->t = 0.0;
  664. model->n_x=app_context->n_x;
  665. // app_context->ierr=VecCreateMPIWithArray(app_context->mpi_comm_global, model->n_x, PETSC_DECIDE, app_context->x_0, &model->x_k_hat);
  666. // app_context->ierr=VecCreateMPIWithArray(app_context->mpi_comm_global, model->n_x, model->n_x, app_context->x_0, &model->x_k_hat);
  667. app_context->ierr=VecCreate(app_context->mpi_comm_global, &model->x_k_hat);
  668. app_context->ierr=VecSetSizes(model->x_k_hat, PETSC_DECIDE,app_context->n_x);
  669. app_context->ierr=VecSetFromOptions(model->x_k_hat);
  670. for(i=0;i<model->n_x; i++) app_context->tmp_x_indices[i]=i;
  671. VecSetValues(model->x_k_hat,model->n_x,app_context->tmp_x_indices,app_context->x_0,ADD_VALUES);
  672. VecAssemblyBegin(model->x_k_hat);
  673. VecAssemblyEnd(model->x_k_hat);
  674. app_context_report_error(app_context->ierr,"model_set_opeartor_and_intial_condition: VecCreateMPIWithArray",app_context,__LINE__,__FUNCT__,__FILE__);
  675. model->n_theta=app_context->n_theta;
  676. //app_context->ierr=VecCreateMPIWithArray(app_context->mpi_comm_global, model->n_theta, PETSC_DECIDE, app_context->theta_0, &model->theta_k_hat);
  677. // app_context->ierr=VecCreateMPIWithArray(app_context->mpi_comm_global, model->n_theta, model->n_theta, app_context->theta_0, &model->theta_k_hat);
  678. app_context->ierr=VecCreate(app_context->mpi_comm_global, &model->theta_k_hat);
  679. app_context->ierr=VecSetSizes(model->theta_k_hat, PETSC_DECIDE,app_context->n_theta);
  680. app_context->ierr=VecSetFromOptions(model->theta_k_hat);
  681. for(i=0;i<model->n_theta; i++) app_context->tmp_theta_indices[i]=i;
  682. VecSetValues(model->theta_k_hat,model->n_theta,app_context->tmp_theta_indices,app_context->theta_0,ADD_VALUES);
  683. VecAssemblyBegin(model->theta_k_hat);
  684. VecAssemblyEnd(model->theta_k_hat);
  685. app_context_report_error(app_context->ierr,"model_set_opeartor_and_intial_condition: VecCreateMPIWithArray",app_context,__LINE__,__FUNCT__,__FILE__);
  686. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  687. app_context_report_info(INFO_PETSC_REALARRAY,app_context->n_x, app_context->x_0,"model_set_opeartor_and_intial_condition, app_context->x_0", app_context);
  688. app_context_report_info(INFO_PETSC_REALARRAY, app_context->n_theta, app_context->theta_0,"model_set_opeartor_and_intial_condition, app_context->theta_0", app_context);
  689. app_context_report_info(INFO_PETSC_VEC,1, &model->x_k_hat,"model_set_opeartor_and_intial_condition, model->x_0_hat", app_context);
  690. app_context_report_info(INFO_PETSC_VEC, 1, &model->theta_k_hat,"model_set_opeartor_and_intial_condition, model->theta_0_hat", app_context);
  691. }
  692. }else if(0){ //model 02:
  693. app_context_report_error(app_context->ierr,"model_set_opeartor_and_intial_condition: not implemented yet",app_context,__LINE__,__FUNCT__,__FILE__);
  694. }else{
  695. app_context_report_error(app_context->ierr,"model_set_opeartor_and_intial_condition: not implemented yet",app_context,__LINE__,__FUNCT__,__FILE__);
  696. }
  697. //other standard setups
  698. VecDuplicate(model->x_k_hat, &model->x_k_minus_1_hat);
  699. VecDuplicate(model->theta_k_hat, &model->theta_k_minus_1_hat);
  700. //diagnosis
  701. if(app_context->diagnosisMode & DIAGNOSIS_DISP_INITIAL_CONF){
  702. app_context_report_info(INFO_PETSC_REAL, 1, &model->t,"model_set_opeartor_and_intial_condition, model->t", app_context);
  703. app_context_report_info(INFO_PETSC_INT, 1, &model->k,"model_set_opeartor_and_intial_condition, model->k", app_context);
  704. app_context_report_info(INFO_PETSC_INT, 1, &model->n_x,"model_set_opeartor_and_intial_condition, model->n_x", app_context);
  705. app_context_report_info(INFO_PETSC_INT, 1, &model->n_theta,"model_set_opeartor_and_intial_condition, model->n_theta", app_context);
  706. app_context_report_info(INFO_PETSC_VEC, 1, &model->theta_k_hat,"model_set_opeartor_and_intial_condition, model->theta_0_hat", app_context);
  707. app_context_report_info(INFO_PETSC_VEC, 1, &model->theta_k_minus_1_hat,"model_set_opeartor_and_intial_condition, model->theta_0_minus_1_hat", app_context);
  708. }
  709. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  710. app_context_report_info(INFO_PETSC_VEC,1, &model->x_k_hat,"model_set_opeartor_and_intial_condition, model->x_0_hat", app_context);
  711. app_context_report_info(INFO_PETSC_VEC, 1, &model->x_k_minus_1_hat,"model_set_opeartor_and_intial_condition, model->x_0_minus_1_hat", app_context);
  712. }
  713. return model;
  714. }
  715. //-------------------------------------------------------------------------------------------------
  716. //---filter routines---
  717. //create and initialize the filter
  718. FILTER_TYPE*
  719. filter_create_and_initialize(APP_CONTEXT_TYPE* app_context,MODEL_TYPE* model)
  720. {
  721. FILTER_TYPE* filter = NULL;
  722. app_context->ierr = PetscMalloc(sizeof(FILTER_TYPE), (void**) &filter);
  723. app_context_report_error(app_context->ierr,"filter_create_and_initialize: PetscMalloc",app_context,__LINE__,__FUNCT__,__FILE__);
  724. filter->n_x = app_context->n_x;
  725. filter->n_theta = app_context->n_theta;
  726. filter = filter_set_intial_condition(filter,model, app_context);
  727. return filter;
  728. }
  729. // Initialize
  730. //1) covariance for state, measurement (portion_afilter->),
  731. //2) dimension (filter->n_x, filter->n_theta),
  732. //3) time stamp (filter->),
  733. //4) state (K)
  734. FILTER_TYPE*
  735. filter_set_intial_condition(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context)
  736. {
  737. int i=0;
  738. //allocate space and initialize covariance matrix (filter subtype)
  739. filter->subfilter = filter_subtype_create_and_initialize(filter,model, app_context);
  740. //model->n_ensem = 2;
  741. //set in filter_subtype_set_intial_condition()
  742. //allocate space for sigma points (in model struture)
  743. PetscMalloc(sizeof(Vec*)*model->n_ensem, &model->x_k_minus_1);
  744. PetscMalloc(sizeof(Vec*)*model->n_ensem, &model->theta_k_minus_1);
  745. PetscMalloc(sizeof(Vec*)*model->n_ensem, &model->x_k);
  746. PetscMalloc(sizeof(Vec*)*model->n_ensem, &model->theta_k);
  747. for(i=0; i<model->n_ensem; i++){
  748. VecCreate(app_context->mpi_comm_global, &model->x_k_minus_1[i]);
  749. VecCreate(app_context->mpi_comm_global, &model->theta_k_minus_1[i]);
  750. VecCreate(app_context->mpi_comm_global, &model->x_k[i]);
  751. VecCreate(app_context->mpi_comm_global, &model->theta_k[i]);
  752. VecSetSizes(model->x_k_minus_1[i], PETSC_DECIDE,app_context->n_x);
  753. VecSetSizes(model->theta_k_minus_1[i], PETSC_DECIDE,app_context->n_theta);
  754. VecSetSizes(model->x_k[i], PETSC_DECIDE,app_context->n_x);
  755. VecSetSizes(model->theta_k[i], PETSC_DECIDE,app_context->n_theta);
  756. VecSetFromOptions(model->x_k_minus_1[i]);
  757. VecSetFromOptions(model->theta_k_minus_1[i]);
  758. VecSetFromOptions(model->x_k[i]);
  759. VecSetFromOptions(model->theta_k[i]);
  760. }
  761. return filter;
  762. }
  763. //create and initialize the filter
  764. FILTER_SUBTYPE*
  765. filter_subtype_create_and_initialize(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context)
  766. {
  767. filter->subfilter = NULL;
  768. app_context->ierr = PetscMalloc(sizeof(FILTER_SUBTYPE), (void**) &filter->subfilter);
  769. app_context_report_error(app_context->ierr,"filter_set_intial_condition: PetscMalloc",app_context,__LINE__,__FUNCT__,__FILE__);
  770. filter->subfilter = filter_subtype_set_intial_condition(filter,model, app_context);
  771. return filter->subfilter;
  772. }
  773. // Initialize the filter subtype
  774. // PetscInt filter_type;
  775. // PetscInt r; //rank ( r>=(n_theat>0)?n_theat:1, r<= n_theta+n_x;
  776. // Mat S_x;
  777. // Mat S_theta;
  778. FILTER_SUBTYPE*
  779. filter_subtype_set_intial_condition(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context)
  780. {
  781. //local values
  782. PetscScalar S_x_value; //all 1 default
  783. PetscScalar* S_theta_values; //1,1,1... default
  784. PetscInt i; //temperory usage
  785. //check pointer
  786. app_context_report_error(filter==NULL,"FILTER_TYPE* filter is null",app_context,__LINE__,__FUNCT__,__FILE__);
  787. app_context_report_error(model==NULL,"MODEL_TYPE* model is null",app_context,__LINE__,__FUNCT__,__FILE__);
  788. FILTER_SUBTYPE* subfilter=filter->subfilter;
  789. app_context_report_error(subfilter==NULL,"filter->subfilter is null",app_context,__LINE__,__FUNCT__,__FILE__);
  790. //initialize the subfilter
  791. subfilter->filter_type = FILTER_TYPE_RUKF; //hard-code rUKF
  792. // Initialize
  793. // Mat S_x;
  794. // Mat S_theta;
  795. switch(subfilter->filter_type)
  796. {
  797. case FILTER_TYPE_RUKF: //reduced-order UKF
  798. //choose rank
  799. if(model->n_theta==0){ //state estimation only
  800. subfilter->r = model->n_x - 1;
  801. }//chanllenge it by setting it to be not equal to n_x
  802. else{ //joint estimation
  803. subfilter->r = model->n_theta + 0 ; //chanllenge it by setting it to be not equal to n_theta
  804. }
  805. model->n_ensem = subfilter->r * 2;
  806. //allocate space for S_x, S_theta; app_context->S_ensemble, app_context->P_z, app_context->S_z
  807. app_context->ierr=MatCreateMPIDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, model->n_x,subfilter->r, PETSC_NULL, &subfilter->S_x);
  808. app_context_report_error(app_context->ierr,"subfilter->S_x MatCreateMPIDense",app_context,__LINE__,__FUNCT__,__FILE__);
  809. app_context->ierr=MatCreateMPIDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, model->n_theta,subfilter->r, PETSC_NULL, &subfilter->S_theta);
  810. app_context_report_error(app_context->ierr,"subfilter->S_theta MatCreateMPIDense",app_context,__LINE__,__FUNCT__,__FILE__);
  811. app_context->ierr=MatCreateMPIDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, model->n_x+model->n_theta,model->n_ensem, PETSC_NULL, &app_context->S_ensemble);
  812. app_context_report_error(app_context->ierr,"app_context->S_ensemble MatCreateMPIDense",app_context,__LINE__,__FUNCT__,__FILE__);
  813. app_context->ierr=MatCreateMPIDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, model->n_x+model->n_theta,model->n_ensem, PETSC_NULL, &app_context->S_ensemble2);
  814. app_context_report_error(app_context->ierr,"app_context->S_ensemble2 MatCreateMPIDense",app_context,__LINE__,__FUNCT__,__FILE__);
  815. app_context->ierr=MatCreateMPIDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, model->n_x+model->n_theta,model->n_x+model->n_theta, PETSC_NULL, &app_context->P_z);
  816. app_context_report_error(app_context->ierr,"app_context->P_z MatCreateMPIDense",app_context,__LINE__,__FUNCT__,__FILE__);
  817. app_context->ierr=MatCreateMPIDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, model->n_x+model->n_theta,subfilter->r, PETSC_NULL, &app_context->S_z);
  818. app_context_report_error(app_context->ierr,"app_context->S_z MatCreateMPIDense",app_context,__LINE__,__FUNCT__,__FILE__);
  819. MatAssemblyBegin(app_context->S_z ,MAT_FINAL_ASSEMBLY ); //for later svd usage
  820. MatAssemblyEnd (app_context->S_z ,MAT_FINAL_ASSEMBLY ); //for later svd usage
  821. MatSetFromOptions( subfilter->S_x );
  822. MatSetFromOptions( subfilter->S_theta );
  823. MatSetFromOptions( app_context->S_ensemble );
  824. MatSetFromOptions( app_context->P_z );
  825. MatSetFromOptions( app_context->S_z );
  826. //initialization S_x and S_theta
  827. //values
  828. app_context->ierr=PetscMalloc(sizeof(PetscScalar)*model->n_theta, &S_theta_values);
  829. for(i=0;i<model->n_theta; i++){
  830. S_theta_values[i] = 1.0;
  831. }
  832. S_x_value = 1.0;
  833. //set (set diagonal element of S_theta first)
  834. for(i=0; i<model->n_theta; i++){
  835. MatSetValue(subfilter->S_theta, i,i, S_theta_values[i], INSERT_VALUES);
  836. }
  837. MatAssemblyBegin(subfilter->S_theta,MAT_FINAL_ASSEMBLY );
  838. MatAssemblyEnd (subfilter->S_theta,MAT_FINAL_ASSEMBLY );
  839. //(then set diagonal element of S_x )
  840. for(i=0; i < subfilter->r-model->n_theta; i++){
  841. MatSetValue(subfilter->S_x, i, i+model->n_theta, S_x_value, INSERT_VALUES);
  842. }
  843. MatAssemblyBegin(subfilter->S_x,MAT_FINAL_ASSEMBLY );
  844. MatAs