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

Last change on this file since 4780 was 4780, checked in by Mathieu Morlighem, 15 years ago

Fixed big leak in InputConvergencex

File size: 2.0 KB
RevLine 
[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
[4778]10bool 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:*/
[4780]13 int i;
14 int converged = 1;
15 int node_converged=1;
16 double *eps = NULL;
[4055]17 extern int my_rank;
[4780]18 int rank_allowed;
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: */
[4780]59 if (converged){
60 return true;}
61 else{
62 return false;}
[4055]63}
Note: See TracBrowser for help on using the repository browser.