source: issm/trunk/src/c/ProcessParamsx/ProcessParamsx.cpp@ 209

Last change on this file since 209 was 209, checked in by Eric.Larour, 16 years ago

Vector parallel fetch not supported. Had to go around it

File size: 3.7 KB
Line 
1/*!\file ProcessParamsx
2 * \brief: process parameters using partitioning vector
3 */
4
5#include "./ProcessParamsx.h"
6
7#undef __FUNCT__
8#define __FUNCT__ "ProcessParamsx"
9
10#include "../shared/shared.h"
11#include "../include/macros.h"
12#include "../toolkits/toolkits.h"
13#include "../EnumDefinitions/EnumDefinitions.h"
14
15void ProcessParamsx( DataSet* parameters, Vec part){
16
17 int i;
18
19 double* partition=NULL;
20 Param* param=NULL;
21
22 /*diagnostic: */
23 double* vx=NULL;
24 double* vy=NULL;
25 double* vz=NULL;
26
27 double* u_g=NULL;
28
29 /*control: */
30 Vec vec_vx_obs=NULL;
31 Vec vec_vy_obs=NULL;
32 Vec vec_control_parameter=NULL;
33
34 double* vx_obs=NULL;
35 double* vy_obs=NULL;
36 double* control_parameter=NULL;
37
38 double* u_g_obs=NULL;
39 double* p_g=NULL;
40
41
42 /*diverse: */
43 int numberofnodes;
44 int analysis_type;
45 int count;
46
47 parameters->FindParam((void*)&analysis_type,"analysis_type");
48 count=parameters->Size();
49
50 parameters->FindParam((void*)&numberofnodes,"numberofnodes");
51
52 /*First serialize partition vector: */
53 VecToMPISerial(&partition,part);
54
55
56 if ( (analysis_type==ControlAnalysisEnum()) ||
57 (analysis_type==DiagnosticHorizAnalysisEnum()) ||
58 (analysis_type==DiagnosticVertAnalysisEnum()) ||
59 (analysis_type==DiagnosticStokesAnalysisEnum())
60 ){
61
62 parameters->FindParam((void*)&vx,"vx");
63 parameters->FindParam((void*)&vy,"vy");
64 parameters->FindParam((void*)&vz,"vz");
65
66 u_g=(double*)xcalloc(numberofnodes*3,sizeof(double));
67
68 if(vx){
69 for(i=0;i<numberofnodes;i++){
70 u_g[(int)(3*partition[i]+0)]=vx[i];
71 }
72 }
73
74 if(vy){
75 for(i=0;i<numberofnodes;i++){
76 u_g[(int)(3*partition[i]+1)]=vy[i];
77 }
78 }
79
80 if(vz){
81 for(i=0;i<numberofnodes;i++){
82 u_g[(int)(3*partition[i]+2)]=vz[i];
83 }
84 }
85
86
87 /*Now, create new parameters: */
88 count++;
89 param= new Param(count,"u_g",DOUBLEVEC);
90 param->SetDoubleVec(u_g,3*numberofnodes);
91 parameters->AddObject(param);
92
93 /*erase old parameters: */
94 param=(Param*)parameters->FindParamObject("vx");
95 parameters->DeleteObject((Object*)param);
96
97 param=(Param*)parameters->FindParamObject("vy");
98 parameters->DeleteObject((Object*)param);
99
100 param=(Param*)parameters->FindParamObject("vz");
101 parameters->DeleteObject((Object*)param);
102
103 }
104
105
106 if(analysis_type==ControlAnalysisEnum()){
107
108 parameters->FindParam((void*)&vx_obs,"vx_obs");
109 parameters->FindParam((void*)&vy_obs,"vy_obs");
110 parameters->FindParam((void*)&control_parameter,"control_parameter");
111
112 /*Now, from vx_obs and vy_obs, build u_g_obs, correctly partitioned: */
113
114 u_g_obs=(double*)xcalloc(numberofnodes*2,sizeof(double));
115 p_g=(double*)xcalloc(numberofnodes*2,sizeof(double));
116
117 for(i=0;i<numberofnodes;i++){
118 u_g_obs[(int)(2*partition[i]+0)]=vx_obs[i];
119 u_g_obs[(int)(2*partition[i]+1)]=vy_obs[i];
120 p_g[(int)(2*partition[i]+0)]=control_parameter[i];
121 }
122
123 /*Now, create new parameters: */
124 count++;
125 param= new Param(count,"u_g_obs",DOUBLEVEC);
126 param->SetDoubleVec(u_g_obs,2*numberofnodes);
127 parameters->AddObject(param);
128
129 count++;
130 param= new Param(count,"p_g",DOUBLEVEC);
131 param->SetDoubleVec(p_g,numberofnodes);
132 parameters->AddObject(param);
133
134 /*erase old parameter: */
135 param=(Param*)parameters->FindParamObject("vx_obs");
136 parameters->DeleteObject((Object*)param);
137
138 param=(Param*)parameters->FindParamObject("vy_obs");
139 parameters->DeleteObject((Object*)param);
140
141 param=(Param*)parameters->FindParamObject("control_parameter");
142 parameters->DeleteObject((Object*)param);
143
144 }
145
146 xfree((void**)&partition);
147
148 xfree((void**)&vx);
149 xfree((void**)&vy);
150 xfree((void**)&vz);
151 xfree((void**)&u_g);
152
153 xfree((void**)&vx_obs);
154 xfree((void**)&vy_obs);
155 xfree((void**)&control_parameter);
156 xfree((void**)&u_g_obs);
157 xfree((void**)&p_g);
158
159}
Note: See TracBrowser for help on using the repository browser.