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 |
|
---|
10 | int 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 | Element* element=NULL;
|
---|
20 | int verbose=0;
|
---|
21 |
|
---|
22 | /*First, configure our datasets: */
|
---|
23 | elements->Configure(elements,loads, nodes,vertices, materials,parameters);
|
---|
24 | nodes-> Configure(elements,loads, nodes,vertices, materials,parameters);
|
---|
25 | loads-> Configure(elements, loads, nodes,vertices, materials,parameters);
|
---|
26 | parameters->Configure(elements,loads, nodes,vertices, materials,parameters);
|
---|
27 |
|
---|
28 | /*retrieve parameters: */
|
---|
29 | parameters->FindParam(&verbose,VerboseEnum);
|
---|
30 |
|
---|
31 | /*allocate dynamic memory: */
|
---|
32 | eps=(double*)xmalloc(num_criterionenums*sizeof(double));
|
---|
33 |
|
---|
34 | /*Go through elements, and ask them to do the job: */
|
---|
35 | for(i=0;i<elements->Size();i++){
|
---|
36 | element=(Element*)elements->GetObjectByOffset(i);
|
---|
37 | element->InputConvergence(&converged,eps,enums,num_enums,criterionenums,criterionvalues,num_criterionenums);
|
---|
38 | if(!converged)break;
|
---|
39 | }
|
---|
40 |
|
---|
41 | if(!converged){
|
---|
42 | /*get convergence information to user: */
|
---|
43 | if(verbose>2)rank_allowed=my_rank;
|
---|
44 | else rank_allowed=0;
|
---|
45 | if(my_rank==rank_allowed){
|
---|
46 | 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]));
|
---|
47 | printf("criterions: "); for(i=0;i<num_criterionenums;i++)printf("%s: %g/%g ",EnumAsString(criterionenums[i]),eps[i],criterionvalues[i]);
|
---|
48 | }
|
---|
49 | }
|
---|
50 |
|
---|
51 | /*In parallel, we need to gather the converged status: */
|
---|
52 | #ifdef _PARALLEL_
|
---|
53 | MPI_Reduce (&converged,&node_converged,1,MPI_INT,MPI_MIN,0,MPI_COMM_WORLD );
|
---|
54 | MPI_Bcast(&node_converged,1,MPI_INT,0,MPI_COMM_WORLD);
|
---|
55 | converged=node_converged;
|
---|
56 | #endif
|
---|
57 |
|
---|
58 | /*Free ressources:*/
|
---|
59 | xfree((void**)&eps);
|
---|
60 |
|
---|
61 | /*return: */
|
---|
62 | return converged;
|
---|
63 | }
|
---|