source: issm/trunk/src/c/modules/InputConvergencex/InputConvergencex.cpp@ 4055

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

Keep simplifying solutions.
New convergence module at the input level, instead at the solution level, when solution vectors are not
available anymore.

File size: 2.1 KB
Line 
1/*!\file InputConvergencex
2 */
3
4#include "./InputConvergencex.h"
5#include "../../shared/shared.h"
6#include "../../include/include.h"
7#include "../../toolkits/toolkits.h"
8#include "../../EnumDefinitions/EnumDefinitions.h"
9
10int InputConvergencex(DataSet* elements,DataSet* nodes,DataSet* vertices,DataSet* loads,DataSet* materials,Parameters* parameters,int enums, int num_enums, int criterionenums, double* criterionvalues,int num_criterionenums){
11
12 /*intermediary:*/
13 int i;
14 int converged = 1;
15 int node_converged=1;
16 double *eps = NULL;
17 extern int my_rank;
18 int rank_allowed;
19
20 /*First, configure our datasets: */
21 elements->Configure(elements,loads, nodes,vertices, materials,parameters);
22 nodes-> Configure(elements,loads, nodes,vertices, materials,parameters);
23 loads-> Configure(elements, loads, nodes,vertices, materials,parameters);
24 parameters->Configure(elements,loads, nodes,vertices, materials,parameters);
25
26 /*allocate dynamic memory: */
27 eps=(double*)xmalloc(num_criterionenums*sizeof(double));
28
29 /*Go through elements, and ask them to do the job: */
30 for(i=0;i<elements->Size();i++){
31 Element* element=(Element*)elements->GetObjectByOffset(i);
32 element->InputConvergence(&converged,eps,enums,num_enums,criterionenums,criterionvalues,num_criterionenums);
33 if(!converged)break;
34 }
35
36 if(!converged){
37 /*get convergence information to user: */
38 if(verbose>2)rank_allowed=my_rank;
39 else rank_allowed=0;
40 if(my_rank==rank_allowed){
41 printf("%s%i%s"," non convergence on element ",element->Id()," for inputs ("); for(i=0;i<num_enums-1;i++)printf("%s,",EnumAsString(enums[i])); printf("%s) ",EnumAsString(enums[num_enums-1]));
42 printf("criterions: "); for(i=0;i<num_criterionenums;i++)printf("%s: %g/%g ",EnumAsString(criterionenums[i]),eps[i],criterionvalues[i]);
43 }
44 }
45
46 /*In parallel, we need to gather the converged status: */
47 #ifdef _PARALLEL_
48 MPI_Reduce (&converged,&node_converged,1,MPI_INT,MPI_MIN,0,MPI_COMM_WORLD );
49 MPI_Bcast(&node_converged,1,MPI_INT,0,MPI_COMM_WORLD);
50 converged=node_converged;
51 #endif
52
53 /*Free ressources:*/
54 xfree((void**)&eps);
55
56 /*return: */
57 return converged;
58}
Note: See TracBrowser for help on using the repository browser.