CalculiX  2.13
A Free Software Three-Dimensional Structural Finite Element Program
transitionmain.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 transitionmain.c:

Go to the source code of this file.

Functions

void transitionmain (double *co, double *dgdxglob, ITG *nobject, ITG *nk, ITG *nodedesi, ITG *ndesi, char *objectset, ITG *ipkon, ITG *kon, char *lakon, ITG *ipoface, ITG *nodface, ITG *nodedesiinv)
 
void * transitionmt (ITG *i)
 

Variables

static char * objectset1
 
static ITGnobject1
 
static ITGnk1
 
static ITGnodedesi1
 
static ITGndesi1
 
static ITGnx1
 
static ITGny1
 
static ITGnz1
 
static ITG num_cpus
 
static ITG ifree1
 
static double * dgdxglob1
 
static double * xo1
 
static double * yo1
 
static double * zo1
 
static double * x1
 
static double * yy1
 
static double * z1
 
static double * co1
 

Function Documentation

◆ transitionmain()

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

◆ transitionmt()

void* transitionmt ( ITG i)
176  {
177 
178  ITG ndesia,ndesib,ndesidelta;
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 
187  &ndesia,&ndesib));
188 
189  return NULL;
190 }
static ITG * ny1
Definition: transitionmain.c:39
static double * zo1
Definition: transitionmain.c:47
static ITG * nodedesi1
Definition: transitionmain.c:39
void FORTRAN(actideacti,(char *set, ITG *nset, ITG *istartset, ITG *iendset, ITG *ialset, char *objectset, ITG *ipkon, ITG *ibject, ITG *ne))
static ITG * nobject1
Definition: transitionmain.c:39
static ITG * ndesi1
Definition: transitionmain.c:39
static ITG ifree1
Definition: transitionmain.c:39
static char * objectset1
Definition: transitionmain.c:37
static double * yo1
Definition: transitionmain.c:47
static double * co1
Definition: transitionmain.c:47
static double * xo1
Definition: transitionmain.c:47
static ITG * nk1
Definition: transitionmain.c:39
static ITG * nz1
Definition: transitionmain.c:39
static ITG num_cpus
Definition: transitionmain.c:39
static double * yy1
Definition: transitionmain.c:47
static double * x1
Definition: transitionmain.c:47
#define ITG
Definition: CalculiX.h:51
subroutine transition(dgdxglob, nobject, nk, nodedesi, ndesi, objectset, xo, yo, zo, x, y, z, nx, ny, nz, co, ifree, ndesia, ndesib)
Definition: transition.f:22
static ITG * nx1
Definition: transitionmain.c:39
static double * z1
Definition: transitionmain.c:47
static double * dgdxglob1
Definition: transitionmain.c:47

Variable Documentation

◆ co1

double * co1
static

◆ dgdxglob1

double* dgdxglob1
static

◆ ifree1

ITG ifree1
static

◆ ndesi1

ITG * ndesi1
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

◆ 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)