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