wcs.h
Go to the documentation of this file.
1 #ifndef WCSH
2 #define WCSH
3 
4 #include "boolean.h"
5 #include "parameters.h"
6 
7 #include "cuiksystem.h"
8 #include "world.h"
9 
10 #ifdef _OPENMP
11  #include <omp.h>
12 #endif
13 
30 typedef struct {
31  boolean isCS;
34  Tworld *w;
36 } TAtlasBase;
37 
38 
48 #define CS_WD_EXT "world/cuik"
49 
50 
75 void InitCSWDFromFile(Tparameters *pr,char *name,TAtlasBase *wcs);
76 
89 #define CS_WD_INIT(pr,name,wcs) InitCSWDFromFile(pr,name,wcs)
90 
108 #define CS_WD_FROM_WORLD(ptr,wcs) { (wcs)->isCS=FALSE; (wcs)->cs=NULL; (wcs)->w=ptr; }
109 
127 #define CS_WD_FROM_CUIKSYSTEM(ptr,wcs) { (wcs)->isCS=TRUE; (wcs)->cs=ptr; (wcs)->w=NULL; }
128 
139 #define ON_CUIKSYSTEM(wcs) (wcs)->isCS
140 
141 
150 #define GET_WORLD(wcs) (wcs)->w
151 
160 #define GET_CUIKSYSTEM(wcs) (wcs)->cs
161 
175 #define CS_WD_EVALUATE_SIMP_EQUATIONS(pr,p,r,wcs) if ((wcs)->isCS) EvaluateSimpCSEquations(pr,p,r,(wcs)->cs); else WorldEvaluateSimpEquations(pr,p,r,(wcs)->w);
176 
191 #define CS_WD_EVALUATE_SUBSET_SIMP_EQUATIONS(pr,st,p,r,wcs) if ((wcs)->isCS) EvaluateSubSetSimpCSEquations(pr,st,p,r,(wcs)->cs); else WorldEvaluateSubSetSimpEquations(pr,st,p,r,(wcs)->w);
192 
206 #define CS_WD_SIMP_INEQUALITIES_HOLD(pr,p,wcs) ((wcs)->isCS ? SimpInequalitiesHoldOnPoint(pr,p,(wcs)->cs) : WorldSimpInequalitiesHold(pr,p,(wcs)->w))
207 
221 #define CS_WD_SIMP_INEQUALITIES_ERROR(pr,p,wcs) ((wcs)->isCS ? ErrorInSimpInequalitiesOnPoint(pr,p,(wcs)->cs) : WorldErrorInSimpInequalities(pr,p,(wcs)->w))
222 
236 #define CS_WD_GET_SYSTEM_VARS(sv,wcs) ((wcs)->isCS ? GetCSSystemVars(sv,(wcs)->cs) : GetWorldSystemVars(sv,(wcs)->w))
237 
252 #define CS_WD_GET_POSITION_VARS(pv,wcs) ((wcs)->isCS ? GetCSPositionVars(pv,(wcs)->cs) : GetWorldPositionVars(pv,(wcs)->w))
253 
269 #define CS_WD_GET_POSITION_VELOCITY_VARS(pv,wcs) ((wcs)->isCS ? GetCSPositionVelocityVars(pv,(wcs)->cs) : GetWorldPositionVelocityVars(pv,(wcs)->w))
270 
285 #define CS_WD_GET_POSITION_EQS(pe,wcs) ((wcs)->isCS ? GetCSPositionEqs(pe,(wcs)->cs) : GetWorldPositionEqs(pe,(wcs)->w))
286 
302 #define CS_WD_GET_POSITION_VELOCITY_EQS(pe,wcs) ((wcs)->isCS ? GetCSPositionVelocityEqs(pe,(wcs)->cs) : GetWorldPositionVelocityEqs(pe,(wcs)->w))
303 
316 #define CS_WD_GET_SYSTEM_VAR_NAME(id,wcs) ((wcs)->isCS ? GetCSSystemVariableName(id,(wcs)->cs) : GetWorldSystemVarName(id,(wcs)->w))
317 
328 #define CS_WD_GET_NUM_SYSTEM_VARS(wcs) ((wcs)->isCS ? GetCSNumSystemVariables((wcs)->cs) : GetWorldNumSystemVariables((wcs)->w))
329 
330 
342 #define CS_WD_GET_VAR_TOPOLOGY(varID,wcs) ((wcs)->isCS ? GetCSVarTopology(varID,(wcs)->cs) : GetWorldVarTopology(varID,(wcs)->w))
343 
358 #define CS_WD_REGENERATE_ORIGINAL_POINT(pr,p,o,wcs) ((wcs)->isCS ? RegenerateOriginalPoint(pr,p,o,(wcs)->cs) : RegenerateWorldOriginalPoint(pr,p,o,(wcs)->w))
359 
373 #define CS_WD_INIT_CD(pr,mt,wcs) { if (!(wcs)->isCS) InitWorldCD(pr,mt,(wcs)->w); }
374 
383 #define CS_ANY_COLLISION(wcs) (((wcs)->isCS)?FALSE:AnyCollision((wcs)->w))
384 
401 #ifdef _OPENMP
402 #define CS_WD_TEST_COLLISION(f,pr,all,s,sPrev,wcs) { if (((wcs)->isCS)||(!WorldCanCollide((wcs)->w))) f=FALSE; else { double *oPrev=NULL,*o; \
403  RegenerateWorldOriginalPoint(pr,s,&o,(wcs)->w);if ((sPrev!=NULL)&&(WorldContinuousCD((wcs)->w))) RegenerateWorldOriginalPoint(pr,sPrev,&oPrev,(wcs)->w); \
404  f=MoveAndCheckCD(pr,all,omp_get_thread_num(),o,oPrev,(wcs)->w); \
405  free(o);if (oPrev!=NULL) free(oPrev);} \
406  }
407 #else
408 #define CS_WD_TEST_COLLISION(f,pr,all,s,sPrev,wcs) { if (((wcs)->isCS)||(!WorldCanCollide((wcs)->w))) f=FALSE; else { double *oPrev=NULL,*o; \
409  RegenerateWorldOriginalPoint(pr,s,&o,(wcs)->w);if ((sPrev!=NULL)&&(WorldContinuousCD((wcs)->w))) RegenerateWorldOriginalPoint(pr,sPrev,&oPrev,(wcs)->w); \
410  f=MoveAndCheckCD(pr,all,0,o,oPrev,(wcs)->w); \
411  free(o);if (oPrev!=NULL) free(oPrev);} \
412  }
413 #endif
414 
430 #define CS_WD_IN_COLLISION(f,pr,s,sPrev,wcs) CS_WD_TEST_COLLISION(f,pr,FALSE,s,sPrev,wcs)
431 
432 
448 #define CS_WD_ALL_COLLISIONS(f,pr,s,sPrev,wcs) CS_WD_TEST_COLLISION(f,pr,TRUE,s,sPrev,wcs)
449 
469 #ifdef _OPENMP
470  #define CS_WD_ORIGINAL_IN_COLLISION(pr,o,oPrev,wcs) (((wcs)->isCS)||(!WorldCanCollide((wcs)->w)) ? FALSE : MoveAndCheckCD(pr,FALSE,omp_get_thread_num(),o,oPrev,(wcs)->w))
471 #else
472  #define CS_WD_ORIGINAL_IN_COLLISION(pr,o,oPrev,wcs) (((wcs)->isCS)||(!WorldCanCollide((wcs)->w)) ? FALSE : MoveAndCheckCD(pr,FALSE,0,o,oPrev,(wcs)->w))
473 #endif
474 
483 #define CS_WD_COST_PTR(wcs) ((wcs)->isCS ? (void *)((wcs)->cs) : (void *)((wcs)->w))
484 
493 #define CS_WD_COST_FN(wcs) ((wcs)->isCS ? EvaluateCSCost : EvaluateWorldCost)
494 
511 #define CS_WD_COST(pr,simp,p,wcs) ((wcs)->isCS ? EvaluateCSCost(pr,simp,p,(void *)((wcs)->cs)) : EvaluateWorldCost(pr,simp,p,(void *)((wcs)->w)))
512 
525 #define CS_WD_GET_SIMP_TOPOLOGY(pr,tp,wcs) ((wcs)->isCS ? GetSimpCSTopology(pr,tp,(wcs)->cs) : GetWorldSimpTopology(pr,tp,(wcs)->w))
526 
539 #define CS_WD_GET_TOPOLOGY(pr,tp,wcs) ((wcs)->isCS ? GetCSTopology(pr,tp,(wcs)->cs) : GetWorldTopology(pr,tp,(wcs)->w))
540 
555 #define CS_WD_REGENERATE_SOLUTION_POINT(pr,p,r,wcs) ((wcs)->isCS ? RegenerateSolutionPoint(pr,p,r,(wcs)->cs) : RegenerateWorldSolutionPoint(pr,p,r,(wcs)->w))
556 
570 #define CS_WD_GENERATE_SIMPLIFIED_POINT(pr,p,r,wcs) ((wcs)->isCS ? GenerateSimplifiedPoint(pr,p,r,(wcs)->cs) : WorldGenerateSimplifiedPoint(pr,p,r,(wcs)->w))
571 
584 #define CS_WD_ERROR_IN_SIMP_EQUATIONS(pr,p,wcs) ((wcs)->isCS ? ErrorInSimpCSEquations(pr,p,(wcs)->cs) : WorldErrorInSimpEquations(pr,p,(wcs)->w))
585 
600 #define CS_WD_ERROR_IN_EQUATIONS(pr,p,wcs) ((wcs)->isCS ? ErrorInCSEquations(pr,p,(wcs)->cs) : WorldErrorInEquations(pr,p,(wcs)->w))
601 
614 #define CS_WD_GENERATE_SIMP_INITIAL_BOX(pr,b,wcs) { if ((wcs)->isCS) GenerateSimpInitialBox(pr,b,(wcs)->cs); else GetWorldSimpInitialBox(pr,b,(wcs)->w); }
615 
628 #define CS_WD_GET_SIMP_JACOBIAN(pr,J,wcs) { if ((wcs)->isCS) GetSimpCSJacobian(pr,J,(wcs)->cs); else GetWorldSimpJacobian(pr,J,(wcs)->w); }
629 
644 #define CS_WD_GET_SIMP_NJACOBIAN(pr,nJ,wcs) ((wcs)->isCS?GetSimpCSNJacobian(pr,nJ,(wcs)->cs):GetWorldSimpNJacobian(pr,nJ,(wcs)->w))
645 
661 #define CS_WD_GET_SIMP_NHESSIAN(pr,sJ,nH,wcs) ((wcs)->isCS?GetSimpCSNHessian(pr,sJ,nH,(wcs)->cs):GetWorldSimpNHessian(pr,sJ,nH,(wcs)->w))
662 
663 
674 #define CS_WD_MANIFOLD_DIMENSION(pr,p,wcs) ((wcs)->isCS ? ManifoldDimension(pr,p,(wcs)->cs) : WorldManifoldDimension(pr,p,(wcs)->w))
675 
688 #define CS_WD_NEWTON_IN_SIMP(pr,p,wcs) ((wcs)->isCS ? CuikNewtonSimp(pr,p,(wcs)->cs) : WorldSimpCuikNewton(pr,p,(wcs)->w))
689 
699 #define CS_WD_HAS_VELOCITY(pr,wcs) ((wcs)->isCS ? CuikHasVelocity(pr,(wcs)->cs) : WorldHasVelocity(pr,(wcs)->w))
700 
711 #define CS_WD_DELETE(wcs) { if ((wcs)->isCS) { DeleteCuikSystem((wcs)->cs); free((wcs)->cs); } else { DeleteWorld((wcs)->w); free((wcs)->w); } }
712 
713 #endif