Changeset 18353
- Timestamp:
- 08/08/14 14:34:03 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
r18351 r18353 194 194 195 195 }/*}}}*/ 196 void CreateRis(IssmDouble** pRi_plus_serial,IssmDouble** pRi_minus_serial,Mat Mc,Mat D,IssmDouble* ml_serial,Vec uvec,IssmDouble* u,IssmDouble* udot,IssmDouble deltat){/*{{{*/ 197 198 /*Intermediaries*/ 199 Vec Ri_plus = NULL; 200 Vec Ri_minus = NULL; 201 IssmDouble uiLmax = 3.; 202 IssmDouble uiLmin = 2.; 203 int ncols,ncols2,rstart,rend; 204 double d; 205 int *cols = NULL; 206 int *cols2 = NULL; 207 double *vals = NULL; 208 double *vals2 = NULL; 209 210 /*Initialize vectors*/ 211 VecDuplicate(uvec,&Ri_plus); 212 VecDuplicate(uvec,&Ri_minus); 213 214 /*Go through D and calculate Ris*/ 215 MatGetOwnershipRange(D,&rstart,&rend); 216 for(int row=rstart; row<rend; row++){ 217 double Pi_plus = 0.; 218 double Pi_minus = 0.; 219 MatGetRow(Mc,row,&ncols, (const int**)&cols, (const double**)&vals); 220 MatGetRow(D ,row,&ncols2,(const int**)&cols2,(const double**)&vals2); 221 _assert_(ncols==ncols2); 222 for(int j=0; j<ncols; j++) { 223 _assert_(cols[j]==cols2[j]); 224 d = vals[j]*(udot[row] - udot[cols[j]]) + vals2[j]*(u[row] - u[cols[j]]); 225 if(row!=cols[j]){ 226 if(d>0.){ 227 Pi_plus += d; 228 } 229 else{ 230 Pi_minus += d; 231 } 232 } 233 } 234 235 /*Compute Qis and Ris*/ 236 double Qi_plus = ml_serial[row]/deltat*(uiLmax - u[row]); 237 double Qi_minus = ml_serial[row]/deltat*(uiLmin - u[row]); 238 d = 1.; 239 if(Pi_plus!=0.) d = min(1.,Qi_plus/Pi_plus); 240 VecSetValue(Ri_plus,row,(const double)d,INSERT_VALUES); 241 d = 1.; 242 if(Pi_minus!=0.) d = min(1.,Qi_minus/Pi_minus); 243 VecSetValue(Ri_minus,row,(const double)d,INSERT_VALUES); 244 245 MatRestoreRow(Mc,row,&ncols, (const int**)&cols, (const double**)&vals); 246 MatRestoreRow(D ,row,&ncols2,(const int**)&cols2,(const double**)&vals2); 247 } 248 VecAssemblyBegin(Ri_plus); 249 VecAssemblyEnd( Ri_plus); 250 VecAssemblyBegin(Ri_minus); 251 VecAssemblyEnd( Ri_minus); 252 253 /*Serialize Ris*/ 254 IssmDouble* Ri_plus_serial = NULL; 255 IssmDouble* Ri_minus_serial = NULL; 256 VecToMPISerial(&Ri_plus_serial,Ri_plus,IssmComm::GetComm()); 257 VecToMPISerial(&Ri_minus_serial,Ri_minus,IssmComm::GetComm()); 258 VecFree(&Ri_plus); 259 VecFree(&Ri_minus); 260 261 /*Assign output pointer*/ 262 *pRi_plus_serial = Ri_plus_serial; 263 *pRi_minus_serial = Ri_minus_serial; 264 }/*}}}*/ 265 void CreateFbar(Vec* pFbar,IssmDouble* Ri_plus,IssmDouble* Ri_minus,Mat Mc,Mat D,IssmDouble* udot,IssmDouble* u,Vec uvec){/*{{{*/ 266 267 /*Intermediaries*/ 268 Vec Fbar = NULL; 269 int ncols,ncols2,rstart,rend; 270 double d,f_ij; 271 int *cols = NULL; 272 int *cols2 = NULL; 273 double *vals = NULL; 274 double *vals2 = NULL; 275 276 /*Build fbar*/ 277 VecDuplicate(uvec,&Fbar); 278 MatGetOwnershipRange(D,&rstart,&rend); 279 for(int row=rstart; row<rend; row++){ 280 MatGetRow(Mc,row,&ncols, (const int**)&cols, (const double**)&vals); 281 MatGetRow(D ,row,&ncols2,(const int**)&cols2,(const double**)&vals2); 282 _assert_(ncols==ncols2); 283 d = 0.; 284 for(int j=0; j<ncols; j++) { 285 _assert_(cols[j]==cols2[j]); 286 if(row==cols[j]) continue; 287 f_ij = vals[j]*(udot[row] - udot[cols[j]]) + vals2[j]*(u[row] - u[cols[j]]); 288 if(f_ij>0){ 289 d += min(Ri_plus[row],Ri_minus[cols[j]]) * f_ij; 290 } 291 else{ 292 d += min(Ri_minus[row],Ri_plus[cols[j]]) * f_ij; 293 } 294 } 295 VecSetValue(Fbar,row,(const double)d,INSERT_VALUES); 296 MatRestoreRow(Mc,row,&ncols, (const int**)&cols, (const double**)&vals); 297 MatRestoreRow(D ,row,&ncols2,(const int**)&cols2,(const double**)&vals2); 298 } 299 VecAssemblyBegin(Fbar); 300 VecAssemblyEnd( Fbar); 301 302 /*Assign output pointer*/ 303 *pFbar = Fbar; 304 }/*}}}*/ 196 305 #endif 197 306 void solutionsequence_fct(FemModel* femmodel){ … … 253 362 delete uf; 254 363 255 /*Go solve !*/364 /*Go solve lower order solution*/ 256 365 SolverxPetsc(&u,LHS,RHS,NULL,NULL, femmodel->parameters); 257 366 MatFree(&LHS); … … 264 373 IssmDouble* udot_serial = NULL; 265 374 IssmDouble* u_serial = NULL; 266 IssmDouble* ml_serial 375 IssmDouble* ml_serial = NULL; 267 376 VecToMPISerial(&udot_serial,udot ,IssmComm::GetComm()); 268 377 VecToMPISerial(&u_serial ,u ,IssmComm::GetComm()); … … 270 379 271 380 /*Anti diffusive fluxes*/ 272 Vec Ri_plus = NULL; 273 Vec Ri_minus = NULL; 274 double uiLmax = 3.; 275 double uiLmin = 2.; 276 VecDuplicate(u,&Ri_plus); 277 VecDuplicate(u,&Ri_minus); 278 MatGetOwnershipRange(K_petsc,&rstart,&rend); 279 for(int row=rstart; row<rend; row++){ 280 double Pi_plus = 0.; 281 double Pi_minus = 0.; 282 MatGetRow(Mc_petsc,row,&ncols, (const int**)&cols, (const double**)&vals); 283 MatGetRow(D_petsc ,row,&ncols2,(const int**)&cols2,(const double**)&vals2); 284 _assert_(ncols==ncols2); 285 for(int j=0; j<ncols; j++) { 286 _assert_(cols[j]==cols2[j]); 287 d = vals[j]*(udot_serial[row] - udot_serial[cols[j]]) + vals2[j]*(u_serial[row] - u_serial[cols[j]]); 288 if(row!=cols[j]){ 289 if(d>0.){ 290 Pi_plus += d; 291 } 292 else{ 293 Pi_minus += d; 294 } 295 } 296 } 297 298 /*Compute Qis and Ris*/ 299 double Qi_plus = ml_serial[row]/deltat*(uiLmax - u_serial[row]); 300 double Qi_minus = ml_serial[row]/deltat*(uiLmin - u_serial[row]); 301 d = 1.; 302 if(Pi_plus!=0.) d = min(1.,Qi_plus/Pi_plus); 303 VecSetValue(Ri_plus,row,(const double)d,INSERT_VALUES); 304 d = 1.; 305 if(Pi_minus!=0.) d = min(1.,Qi_minus/Pi_minus); 306 VecSetValue(Ri_minus,row,(const double)d,INSERT_VALUES); 307 308 MatRestoreRow(Mc_petsc, row,&ncols, (const int**)&cols, (const double**)&vals); 309 MatRestoreRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2); 310 } 311 VecAssemblyBegin(Ri_plus); 312 VecAssemblyEnd( Ri_plus); 313 VecAssemblyBegin(Ri_minus); 314 VecAssemblyEnd( Ri_minus); 315 316 /*Serialize Ris*/ 381 Vec Fbar = NULL; 382 IssmDouble* Ri_minus_serial = NULL; 317 383 IssmDouble* Ri_plus_serial = NULL; 318 IssmDouble* Ri_minus_serial = NULL; 319 VecToMPISerial(&Ri_plus_serial,Ri_plus,IssmComm::GetComm()); 320 VecToMPISerial(&Ri_minus_serial,Ri_minus,IssmComm::GetComm()); 321 VecFree(&Ri_plus); 322 VecFree(&Ri_minus); 323 324 /*Build fbar*/ 325 Vec Fbar = NULL; 326 VecDuplicate(u,&Fbar); 327 for(int row=rstart; row<rend; row++){ 328 MatGetRow(Mc_petsc,row,&ncols, (const int**)&cols, (const double**)&vals); 329 MatGetRow(D_petsc ,row,&ncols2,(const int**)&cols2,(const double**)&vals2); 330 _assert_(ncols==ncols2); 331 d = 0.; 332 for(int j=0; j<ncols; j++) { 333 _assert_(cols[j]==cols2[j]); 334 if(row==cols[j]) continue; 335 double f_ij = vals[j]*(udot_serial[row] - udot_serial[cols[j]]) + vals2[j]*(u_serial[row] - u_serial[cols[j]]); 336 if(f_ij>0){ 337 d += min(Ri_plus_serial[row],Ri_minus_serial[cols[j]]) * f_ij; 338 } 339 else{ 340 d += min(Ri_minus_serial[row],Ri_plus_serial[cols[j]]) * f_ij; 341 } 342 } 343 VecSetValue(Fbar,row,(const double)d,INSERT_VALUES); 344 MatRestoreRow(Mc_petsc, row,&ncols, (const int**)&cols, (const double**)&vals); 345 MatRestoreRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2); 346 } 347 VecAssemblyBegin(Fbar); 348 VecAssemblyEnd( Fbar); 349 384 CreateRis(&Ri_plus_serial,&Ri_minus_serial,Mc_petsc,D_petsc,ml_serial,u,u_serial,udot_serial,deltat); 385 CreateFbar(&Fbar,Ri_plus_serial,Ri_minus_serial,Mc_petsc,D_petsc,udot_serial,u_serial,u); 386 387 /*Clean up*/ 350 388 MatFree(&D_petsc); 351 389 delete Mc; … … 357 395 358 396 /*Compute solution u^n+1 = u_L + deltat Ml^-1 fbar*/ 359 Vec temp1 = NULL; VecDuplicate(u,&temp1);397 Vec temp1 = NULL; 360 398 VecDuplicate(u,&temp1); 361 399 VecPointwiseDivide(temp1,Fbar,Ml_petsc); //temp1 = Ml^-1 temp2
Note:
See TracChangeset
for help on using the changeset viewer.