CalculiX  2.13
A Free Software Three-Dimensional Structural Finite Element Program
filtermain.c File Reference
#include <unistd.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <pthread.h>
#include "CalculiX.h"
Include dependency graph for filtermain.c:

Go to the source code of this file.

Functions

void filtermain (double *co, double *dgdxglob, ITG *nobject, ITG *nk, ITG *nodedesi, ITG *ndesi, char *objectset)
 
void * filtermt (ITG *i)
 

Variables

static char * objectset1
 
static ITGnobject1
 
static ITGnk1
 
static ITGnodedesi1
 
static ITGndesi1
 
static ITGnx1
 
static ITGny1
 
static ITGnz1
 
static ITGneighbor1 =NULL
 
static ITG num_cpus
 
static double * dgdxglob1
 
static double * xo1
 
static double * yo1
 
static double * zo1
 
static double * x1
 
static double * yy1
 
static double * z1
 
static double * r1 =NULL
 

Function Documentation

◆ filtermain()

void filtermain ( double *  co,
double *  dgdxglob,
ITG nobject,
ITG nk,
ITG nodedesi,
ITG ndesi,
char *  objectset 
)
51  {
52 
53  /* filtering the sensitivities */
54 
55  ITG *nx=NULL,*ny=NULL,*nz=NULL,i,*ithread=NULL;
56 
57  double *xo=NULL,*yo=NULL,*zo=NULL,*x=NULL,*y=NULL,*z=NULL;
58 
59  /* if no radius is defined no filtering is performed
60  the radius applies to all objective functions */
61 
62  if(*nobject==0){return;}
63  if(strcmp1(&objectset[81]," ")==0){
64  for(i=1;i<2**nk**nobject;i=i+2){
65  dgdxglob[i]=dgdxglob[i-1];
66  }
67  return;
68  }
69 
70  /* prepare for near3d_se */
71 
72  NNEW(xo,double,*ndesi);
73  NNEW(yo,double,*ndesi);
74  NNEW(zo,double,*ndesi);
75  NNEW(x,double,*ndesi);
76  NNEW(y,double,*ndesi);
77  NNEW(z,double,*ndesi);
78  NNEW(nx,ITG,*ndesi);
79  NNEW(ny,ITG,*ndesi);
80  NNEW(nz,ITG,*ndesi);
81 
82  FORTRAN(prefilter,(co,nodedesi,ndesi,xo,yo,zo,x,y,z,nx,ny,nz));
83 
84  /* variables for multithreading procedure */
85 
86  ITG sys_cpus;
87  char *env,*envloc,*envsys;
88 
89  num_cpus = 0;
90  sys_cpus=0;
91 
92  /* explicit user declaration prevails */
93 
94  envsys=getenv("NUMBER_OF_CPUS");
95  if(envsys){
96  sys_cpus=atoi(envsys);
97  if(sys_cpus<0) sys_cpus=0;
98  }
99 
100  /* automatic detection of available number of processors */
101 
102  if(sys_cpus==0){
103  sys_cpus = getSystemCPUs();
104  if(sys_cpus<1) sys_cpus=1;
105  }
106 
107  /* local declaration prevails, if strictly positive */
108 
109  envloc = getenv("CCX_NPROC_FILTER");
110  if(envloc){
111  num_cpus=atoi(envloc);
112  if(num_cpus<0){
113  num_cpus=0;
114  }else if(num_cpus>sys_cpus){
115  num_cpus=sys_cpus;
116  }
117 
118  }
119 
120  /* else global declaration, if any, applies */
121 
122  env = getenv("OMP_NUM_THREADS");
123  if(num_cpus==0){
124  if (env)
125  num_cpus = atoi(env);
126  if (num_cpus < 1) {
127  num_cpus=1;
128  }else if(num_cpus>sys_cpus){
129  num_cpus=sys_cpus;
130  }
131  }
132 
133  /* check that the number of cpus does not supercede the number
134  of design variables */
135 
136  if(*ndesi<num_cpus) num_cpus=*ndesi;
137 
138  pthread_t tid[num_cpus];
139 
140  NNEW(neighbor1,ITG,num_cpus*(*ndesi+6));
141  NNEW(r1,double,num_cpus*(*ndesi+6));
142 
143  dgdxglob1=dgdxglob;nobject1=nobject;nk1=nk;nodedesi1=nodedesi;
144  ndesi1=ndesi;objectset1=objectset;xo1=xo;yo1=yo;zo1=zo;
145  x1=x;yy1=y;z1=z;nx1=nx;ny1=ny;nz1=nz;
146 
147  /* filtering */
148 
149  printf(" Using up to %" ITGFORMAT " cpu(s) for filtering the sensitivities.\n\n", num_cpus);
150 
151  /* create threads and wait */
152 
153  NNEW(ithread,ITG,num_cpus);
154  for(i=0; i<num_cpus; i++) {
155  ithread[i]=i;
156  pthread_create(&tid[i], NULL, (void *)filtermt, (void *)&ithread[i]);
157  }
158  for(i=0; i<num_cpus; i++) pthread_join(tid[i], NULL);
159 
160  SFREE(neighbor1);SFREE(r1);SFREE(xo);SFREE(yo);SFREE(zo);
161  SFREE(x);SFREE(y);SFREE(z);SFREE(nx);SFREE(ny);SFREE(nz);
162  SFREE(ithread);
163 
164  /* postprocessing the filtered results */
165 
166 // FORTRAN(postfilter,(dgdxglob,nobject,nk,nodedesi,ndesi));
167 
168  return;
169 
170 }
static ITG * ndesi1
Definition: filtermain.c:39
static ITG * nx1
Definition: filtermain.c:39
#define ITGFORMAT
Definition: CalculiX.h:52
static double * yy1
Definition: filtermain.c:48
static double * zo1
Definition: filtermain.c:48
void * filtermt(ITG *i)
Definition: filtermain.c:174
static double * z1
Definition: filtermain.c:48
int pthread_create(pthread_t *thread_id, const pthread_attr_t *attributes, void *(*thread_function)(void *), void *arguments)
static double * x1
Definition: filtermain.c:48
static double * dgdxglob1
Definition: filtermain.c:48
static ITG * nz1
Definition: filtermain.c:39
static ITG * nobject1
Definition: filtermain.c:39
static ITG num_cpus
Definition: filtermain.c:39
subroutine prefilter(co, nodedesi, ndesi, xo, yo, zo, x, y, z, nx, ny, nz)
Definition: prefilter.f:21
void FORTRAN(actideacti,(char *set, ITG *nset, ITG *istartset, ITG *iendset, ITG *ialset, char *objectset, ITG *ipkon, ITG *ibject, ITG *ne))
ITG strcmp1(const char *s1, const char *s2)
Definition: strcmp1.c:24
ITG getSystemCPUs()
Definition: getSystemCPUs.c:40
static double * r1
Definition: filtermain.c:48
static ITG * nk1
Definition: filtermain.c:39
static ITG * neighbor1
Definition: filtermain.c:39
#define SFREE(a)
Definition: CalculiX.h:41
static char * objectset1
Definition: filtermain.c:37
static double * xo1
Definition: filtermain.c:48
int pthread_join(pthread_t thread, void **status_ptr)
static ITG * nodedesi1
Definition: filtermain.c:39
#define ITG
Definition: CalculiX.h:51
static ITG * ny1
Definition: filtermain.c:39
#define NNEW(a, b, c)
Definition: CalculiX.h:39
static double * yo1
Definition: filtermain.c:48

◆ filtermt()

void* filtermt ( ITG i)
174  {
175 
176  ITG indexr,ndesia,ndesib,ndesidelta;
177 
178  indexr=*i*(*ndesi1+6);
179 
180  ndesidelta=(ITG)ceil(*ndesi1/(double)num_cpus);
181  ndesia=*i*ndesidelta+1;
182  ndesib=(*i+1)*ndesidelta;
183  if(ndesib>*ndesi1) ndesib=*ndesi1;
184 
185 // printf("i=%" ITGFORMAT ",ntria=%" ITGFORMAT ",ntrib=%" ITGFORMAT "\n",i,ntria,ntrib);
186 // printf("indexad=%" ITGFORMAT ",indexau=%" ITGFORMAT ",indexdi=%" ITGFORMAT "\n",indexad,indexau,indexdi);
187 
189  xo1,yo1,zo1,x1,yy1,z1,nx1,ny1,nz1,&neighbor1[indexr],
190  &r1[indexr],&ndesia,&ndesib));
191 
192  return NULL;
193 }
static ITG * ndesi1
Definition: filtermain.c:39
static ITG * nx1
Definition: filtermain.c:39
static double * yy1
Definition: filtermain.c:48
static double * zo1
Definition: filtermain.c:48
static double * z1
Definition: filtermain.c:48
static double * x1
Definition: filtermain.c:48
static double * dgdxglob1
Definition: filtermain.c:48
static ITG * nz1
Definition: filtermain.c:39
static ITG * nobject1
Definition: filtermain.c:39
static ITG num_cpus
Definition: filtermain.c:39
void FORTRAN(actideacti,(char *set, ITG *nset, ITG *istartset, ITG *iendset, ITG *ialset, char *objectset, ITG *ipkon, ITG *ibject, ITG *ne))
subroutine filter(dgdxglob, nobject, nk, nodedesi, ndesi, objectset, xo, yo, zo, x, y, z, nx, ny, nz, neighbor, r, ndesia, ndesib)
Definition: filter.f:22
static double * r1
Definition: filtermain.c:48
static ITG * nk1
Definition: filtermain.c:39
static ITG * neighbor1
Definition: filtermain.c:39
static char * objectset1
Definition: filtermain.c:37
static double * xo1
Definition: filtermain.c:48
static ITG * nodedesi1
Definition: filtermain.c:39
#define ITG
Definition: CalculiX.h:51
static ITG * ny1
Definition: filtermain.c:39
static double * yo1
Definition: filtermain.c:48

Variable Documentation

◆ dgdxglob1

double* dgdxglob1
static

◆ ndesi1

ITG * ndesi1
static

◆ neighbor1

ITG * neighbor1 =NULL
static

◆ nk1

ITG * nk1
static

◆ nobject1

ITG* nobject1
static

◆ nodedesi1

ITG * nodedesi1
static

◆ num_cpus

ITG num_cpus
static

◆ nx1

ITG * nx1
static

◆ ny1

ITG * ny1
static

◆ nz1

ITG * nz1
static

◆ objectset1

char* objectset1
static

◆ r1

double * r1 =NULL
static

◆ x1

double * x1
static

◆ xo1

double * xo1
static

◆ yo1

double * yo1
static

◆ yy1

double * yy1
static

◆ z1

double * z1
static

◆ zo1

double * zo1
static
Hosted by OpenAircraft.com, (Michigan UAV, LLC)