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

Last change on this file since 552 was 552, checked in by Mathieu Morlighem, 16 years ago

moved melting_g to m_g

File size: 5.6 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 /*thermal*/
30 double* pressure=NULL;
31 double* temperature=NULL;
32 double* melting=NULL;
33
34 double* p_g=NULL;
35 double* t_g=NULL;
36 double* m_g=NULL;
37
38 /*control: */
39 Vec vec_vx_obs=NULL;
40 Vec vec_vy_obs=NULL;
41 Vec vec_control_parameter=NULL;
42
43 double* vx_obs=NULL;
44 double* vy_obs=NULL;
45 double* control_parameter=NULL;
46
47 double* u_g_obs=NULL;
48
49 /*diverse: */
50 int numberofnodes;
51 int analysis_type;
52 int sub_analysis_type;
53 int count;
54
55 parameters->FindParam((void*)&analysis_type,"analysis_type");
56 parameters->FindParam((void*)&sub_analysis_type,"sub_analysis_type");
57 count=parameters->Size();
58
59 parameters->FindParam((void*)&numberofnodes,"numberofnodes");
60
61 /*First serialize partition vector: */
62 if(part)VecToMPISerial(&partition,part);
63
64
65 if ( (analysis_type==ControlAnalysisEnum()) || (analysis_type==DiagnosticAnalysisEnum()) || (analysis_type==ThermalAnalysisEnum())){
66
67 parameters->FindParam((void*)&vx,"vx");
68 parameters->FindParam((void*)&vy,"vy");
69 parameters->FindParam((void*)&vz,"vz");
70
71 if(numberofnodes){
72 u_g=(double*)xcalloc(numberofnodes*3,sizeof(double));
73
74 if(vx){
75 for(i=0;i<numberofnodes;i++){
76 u_g[(int)(3*partition[i]+0)]=vx[i];
77 }
78 }
79
80 if(vy){
81 for(i=0;i<numberofnodes;i++){
82 u_g[(int)(3*partition[i]+1)]=vy[i];
83 }
84 }
85 if(vz){
86 for(i=0;i<numberofnodes;i++){
87 u_g[(int)(3*partition[i]+2)]=vz[i];
88 }
89 }
90
91
92 /*Now, create new parameters: */
93 count++;
94 param= new Param(count,"u_g",DOUBLEVEC);
95 param->SetDoubleVec(u_g,3*numberofnodes);
96 parameters->AddObject(param);
97
98 /*erase old parameters: */
99 param=(Param*)parameters->FindParamObject("vx");
100 parameters->DeleteObject((Object*)param);
101
102 param=(Param*)parameters->FindParamObject("vy");
103 parameters->DeleteObject((Object*)param);
104
105 param=(Param*)parameters->FindParamObject("vz");
106 parameters->DeleteObject((Object*)param);
107 }
108
109 }
110
111
112 if(analysis_type==ControlAnalysisEnum()){
113
114 parameters->FindParam((void*)&vx_obs,"vx_obs");
115 parameters->FindParam((void*)&vy_obs,"vy_obs");
116 parameters->FindParam((void*)&control_parameter,"control_parameter");
117
118 /*Now, from vx_obs and vy_obs, build u_g_obs, correctly partitioned: */
119
120 u_g_obs=(double*)xcalloc(numberofnodes*2,sizeof(double));
121 p_g=(double*)xcalloc(numberofnodes*2,sizeof(double));
122
123 for(i=0;i<numberofnodes;i++){
124 u_g_obs[(int)(2*partition[i]+0)]=vx_obs[i];
125 u_g_obs[(int)(2*partition[i]+1)]=vy_obs[i];
126 p_g[(int)(2*partition[i]+0)]=control_parameter[i];
127 }
128
129 /*Now, create new parameters: */
130 count++;
131 param= new Param(count,"u_g_obs",DOUBLEVEC);
132 param->SetDoubleVec(u_g_obs,2*numberofnodes);
133 parameters->AddObject(param);
134
135 count++;
136 param= new Param(count,"p_g",DOUBLEVEC);
137 param->SetDoubleVec(p_g,2*numberofnodes);
138 parameters->AddObject(param);
139
140 /*erase old parameter: */
141 param=(Param*)parameters->FindParamObject("vx_obs");
142 parameters->DeleteObject((Object*)param);
143
144 param=(Param*)parameters->FindParamObject("vy_obs");
145 parameters->DeleteObject((Object*)param);
146
147 param=(Param*)parameters->FindParamObject("control_parameter");
148 parameters->DeleteObject((Object*)param);
149
150 }
151
152 if(analysis_type==ThermalAnalysisEnum()){
153
154 parameters->FindParam((void*)&pressure,"pressure");
155
156 /*Now, from pressure, build p_g, correctly partitioned: */
157 p_g=(double*)xcalloc(numberofnodes,sizeof(double));
158
159 for(i=0;i<numberofnodes;i++){
160 p_g[(int)(partition[i])]= pressure[i];
161 }
162
163 /*Now, create new parameter: */
164 count++;
165 param= new Param(count,"p_g",DOUBLEVEC);
166 param->SetDoubleVec(p_g,numberofnodes);
167 parameters->AddObject(param);
168
169 /*erase old parameter: */
170 param=(Param*)parameters->FindParamObject("pressure");
171 parameters->DeleteObject((Object*)param);
172
173 if(sub_analysis_type==TransientAnalysisEnum()){
174
175 parameters->FindParam((void*)&temperature,"temperature");
176 parameters->FindParam((void*)&melting,"melting");
177
178 /*Now, from temperature and melting, build t_g and m_g, correctly partitioned: */
179 t_g=(double*)xcalloc(numberofnodes,sizeof(double));
180 m_g=(double*)xcalloc(numberofnodes,sizeof(double));
181
182 for(i=0;i<numberofnodes;i++){
183 t_g[(int)(partition[i])]=temperature[i];
184 m_g[(int)(partition[i])]=melting[i];
185 }
186
187 /*Now, create new parameter: */
188 count++;
189 param= new Param(count,"t_g",DOUBLEVEC);
190 param->SetDoubleVec(t_g,numberofnodes);
191 parameters->AddObject(param);
192
193 count++;
194 param= new Param(count,"m_g",DOUBLEVEC);
195 param->SetDoubleVec(m_g,numberofnodes);
196 parameters->AddObject(param);
197
198 /*erase old parameter: */
199 param=(Param*)parameters->FindParamObject("temperature");
200 parameters->DeleteObject((Object*)param);
201
202 param=(Param*)parameters->FindParamObject("melting");
203 parameters->DeleteObject((Object*)param);
204 }
205 }
206
207 xfree((void**)&partition);
208
209 xfree((void**)&vx);
210 xfree((void**)&vy);
211 xfree((void**)&vz);
212 xfree((void**)&u_g);
213
214 xfree((void**)&vx_obs);
215 xfree((void**)&vy_obs);
216 xfree((void**)&pressure);
217 xfree((void**)&temperature);
218 xfree((void**)&melting);
219 xfree((void**)&control_parameter);
220 xfree((void**)&u_g_obs);
221 xfree((void**)&p_g);
222 xfree((void**)&t_g);
223 xfree((void**)&m_g);
224
225}
Note: See TracBrowser for help on using the repository browser.