# Contents of /trunk/finley/src/Assemble_setNormal.c

Revision 1388 - (show annotations)
Fri Jan 11 07:45:58 2008 UTC (11 years, 9 months ago) by trankine
File MIME type: text/plain
File size: 4763 byte(s)
```And get the *(&(*&(* name right
```
 1 2 /* \$Id\$ */ 3 4 /******************************************************* 5 * 6 * Copyright 2003-2007 by ACceSS MNRF 7 * Copyright 2007 by University of Queensland 8 * 9 * http://esscc.uq.edu.au 10 * Primary Business: Queensland, Australia 11 * Licensed under the Open Software License version 3.0 12 * http://www.opensource.org/licenses/osl-3.0.php 13 * 14 *******************************************************/ 15 16 /**************************************************************/ 17 18 /* assemblage routines: calculates the normal vector at quadrature points on face elements */ 19 20 /**************************************************************/ 21 22 #include "Assemble.h" 23 #include "Util.h" 24 #ifdef _OPENMP 25 #include 26 #endif 27 28 /**************************************************************/ 29 30 31 void Finley_Assemble_setNormal(Finley_NodeFile* nodes, Finley_ElementFile* elements, escriptDataC* normal) { 32 double *local_X=NULL, *dVdv=NULL,*normal_array; 33 index_t sign,node_offset; 34 Finley_RefElement* reference_element=NULL; 35 dim_t e,q, NN, NS, numDim, numQuad, numDim_local; 36 if (nodes==NULL || elements==NULL) return; 37 NN=elements->ReferenceElement->Type->numNodes; 38 NS=elements->ReferenceElement->Type->numShapes; 39 numDim=nodes->numDim; 40 Finley_resetError(); 41 if (Finley_Assemble_reducedIntegrationOrder(normal)) { 42 reference_element=elements->ReferenceElementReducedOrder; 43 } else { 44 reference_element=elements->ReferenceElement; 45 } 46 numQuad=reference_element->numQuadNodes; 47 numDim_local=reference_element->Type->numDim; 48 49 /* set some parameter */ 50 51 if (getFunctionSpaceType(normal)==FINLEY_CONTACT_ELEMENTS_2) { 52 node_offset=NN-NS; 53 sign=-1; 54 } else { 55 node_offset=0; 56 sign=1; 57 } 58 /* check the dimensions of normal */ 59 if (! (numDim==numDim_local || numDim-1==numDim_local)) { 60 Finley_setError(TYPE_ERROR,"Finley_Assemble_setNormal: Cannot calculate normal vector"); 61 } else if (! isDataPointShapeEqual(normal,1,&(numDim))) { 62 Finley_setError(TYPE_ERROR,"Finley_Assemble_setNormal: illegal number of samples of normal Data object"); 63 } else if (! numSamplesEqual(normal,numQuad,elements->numElements)) { 64 Finley_setError(TYPE_ERROR,"Finley_Assemble_setNormal: illegal number of samples of normal Data object"); 65 } else if (! isDataPointShapeEqual(normal,1,&(numDim))) { 66 Finley_setError(TYPE_ERROR,"Finley_Assemble_setNormal: illegal point data shape of normal Data object"); 67 } else if (!isExpanded(normal)) { 68 Finley_setError(TYPE_ERROR,"Finley_Assemble_setNormal: expanded Data object is expected for normal."); 69 } 70 71 /* now we can start */ 72 if (Finley_noError()) { 73 #pragma omp parallel private(local_X,dVdv) 74 { 75 local_X=dVdv=NULL; 76 /* allocation of work arrays */ 77 local_X=THREAD_MEMALLOC(NS*numDim,double); 78 dVdv=THREAD_MEMALLOC(numQuad*numDim*numDim_local,double); 79 if (!(Finley_checkPtr(local_X) || Finley_checkPtr(dVdv) ) ) { 80 /* open the element loop */ 81 #pragma omp for private(e,q,normal_array) schedule(static) 82 for(e=0;enumElements;e++) { 83 /* gather local coordinates of nodes into local_X: */ 84 Finley_Util_Gather_double(NS,&(elements->Nodes[INDEX2(node_offset,e,NN)]),numDim,nodes->Coordinates,local_X); 85 /* calculate dVdv(i,j,q)=local_X(i,n)*DSDv(n,j,q) */ 86 Finley_Util_SmallMatMult(numDim,numDim_local*numQuad,dVdv,NS,local_X,reference_element->dSdv); 87 /* get normalized vector: */ 88 normal_array=getSampleData(normal,e); 89 Finley_NormalVector(numQuad,numDim,numDim_local,dVdv,normal_array); 90 for (q=0;q

## Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision