Tochnog Contact issues-Solved!
[email protected] Fri, 22 Jun 2012 22:48:39 -0500
| Newsgroups | gmane.comp.mathematics.tochnog.user |
|---|---|
| Message-ID | <[email protected]> |
--Apple-Mail=_AC3CDE14-3029-420B-B4DA-50E73D9655CE
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset=us-ascii
Dear Tochnogers,
Following the recent postings regarding tochnog and contact issues, I =
remembered having similar issues before and reviewed the options and =
problems.=20
I realized that contact between a mesh and a point works, as it is shown =
in example 9. Contact between a mesh and a circle worked also (Please =
see attached problem)
contact with a line works perfectly well (see example 14) but contact =
between an ellipse and a mesh had issues and did not work.
After long hours looking at the problem, I have edited and corrected the =
errors in the code in file "geometry.cc" and it works very well, as it =
was supposed to.
I am attaching a copy of the corrected file, so that those building =
their own versions can update their code.
I will be updating the Mac OSX version binary very soon.=20
I would ask those of you who have access to the 64 bit versions of linux =
or windows and would like to contribute with binaries, please send them =
to me.
I will post them so that other users can download them. I would ask that =
you test your binaries before sending them to me.
If you can, for those using Windows, I know that there is a LAPACK =
version already built for windows. It would be nice if it can be built =
with LAPACK for
Windows, so that all versions would have the same capabilities.
If you do not have the LAPACK library option in your build please edit =
the corresponding line in the attached example files. The three small =
attached examples=20
solve the same problem for contact with a point 0.3 units in diameters, =
a circle of 0.3 units radius, and an ellipse with a=3D0.5 and b=3D0.3 =
all having the same center.
For those trying the contact between meshes, remember to include the =
"node_boundary" line in the problem.
Let me have some feedback please!
--Apple-Mail=_AC3CDE14-3029-420B-B4DA-50E73D9655CE
Content-Disposition: attachment;
filename=Testcircle.dat.zip
Content-Type: application/zip;
name="Testcircle.dat.zip"
Content-Transfer-Encoding: base64
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
AAADAAMA3gAAAIAcAAAAAA==
--Apple-Mail=_AC3CDE14-3029-420B-B4DA-50E73D9655CE
Content-Disposition: attachment;
filename=Testpoint.dat.zip
Content-Type: application/zip;
name="Testpoint.dat.zip"
Content-Transfer-Encoding: base64
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
--Apple-Mail=_AC3CDE14-3029-420B-B4DA-50E73D9655CE
Content-Disposition: attachment;
filename=Testellipse.dat.zip
Content-Type: application/zip;
name="Testellipse.dat.zip"
Content-Transfer-Encoding: base64
UEsDBBQACAAIABpH1kAAAAAAAAAAAAAAAAAPABAAVGVzdGVsbGlwc2UuZGF0VVgMAFQ75U+keeRP
9QEUAK1dy3Icu5HdM8L/0Et7QUVl4lX4iFnNxGwZHKl9zbgUySBbd6y/HyTQBWSiT2+mSg7bEoHK
Qh7kAU6iQOD8/V/vp8ff56+Ht18//+f8+fT+z6evj+fv56cfLz/Pb18v729fJ374+Xw5f748/XV+
ff/+cvm9/fvr8vn88vZ0eb88v04/+3h9/rq8bD9s/3r68/nj41lVPH99PZzffjy9vL1cXp4fHh5O
p7f3H+cTneof+rYsS/3bIn/721bMp+sPV1jsbp9mVey3p1Om69+IfS8O3bgP29NpPB234gjfnW7f
7VXx2p/O62Y8pl6cezH5rWlhPE1Lb/oau/U8ymkrD257nvXzHTgft9cTq+ddfz+P1tMo79CtIW9v
im6Ud+w8BIfiLTpRl6fuX/c/xHWUd/h8dNe/uajal8f7ufs/yrnj53zHV/nPHb+145uWERrc8Qtu
a3/wqrzjl+L2fMxxlPvx/tF+HuUdP157eOj29+ArvbL9TcUmd/yi22I3rur5jh/3/qUQRnnHjzGx
ltv+W3V5x8/z5l9Q/eNU/G34Rxr96zp+gTf/4jr6x3X8uMe3xs8p/HJ/kyof5F03+ykP+rmO39rt
l1FglHf8nOvxH0b8u44fpc1/DuP9fsTf2uNfxZ8f/I1beVLx7wd+V6pIfI32+44f+x6fYcSn7/hR
f79X/PWDv8H396v2dfyWuPGLlP9+8HfZns+Lat+Iv7XHp1PlAz8a/Tvsh4Ffj6+0jP4JA791a9+a
1fMDv7w9v6rxMXT8Ft/5t6ryjh+el8IVv8EPsuUdPxc2+ykNfoQRf0tCz3f8KCP8QsfPZRS/sePH
ro9vNPCJA79la192au7r+FEfX4PCLyr8NnwL00f54G/q8Z1UeY+/bf6z/scx/rnt/VnNf7Hj55bh
v3q+OfVY2tfHb5cUPiP+RvwrfK6Nluc7fziM9yfaymnZ+ElujP9p4Je39ic1PqeOn/Pb+JTV+JhG
/KXt+ajmhzTGv86PVb9/8HcZ47MSLx0/zyh+0+Bv2OInL8p+x29Jm/+JR/vXHn9EPf7XMT6uHb9l
HfPbwHcd+IXObzX/rm57Hs9fq+/947fx26n4XDt+Y3xcsyqPI346/n7wb03dfh76S/k34q+PTyGN
+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
AOAAAADrHAAAAAA=
--Apple-Mail=_AC3CDE14-3029-420B-B4DA-50E73D9655CE
Content-Disposition: attachment;
filename=geometry.cc
Content-Type: application/octet-stream;
name="geometry.cc"
Content-Transfer-Encoding: 7bit
/*
Copyright (C) 1998 Dennis Roddeman
email: [email protected]
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation
59 Temple Place, Suite 330, Boston, MA, 02111-1307, USA
*/
// This file was modified and corrected so that the contact with an ellipse geometry
// will work. Modification made by Fernando Lorenzo on June 22, 2012.
#include "tochnog.h"
void geometry( long int inod, double co[], long int geometry_entity[],
long int &in_geometry, double &factor, double normal[],
double &penetration, double projection[],
long int node_type, long int projection_type, long int version )
{
int i=0, level=0;
long j=0, itest=0, idim=0, index=0, ind=0, length_geometry_bounda_factor=0,
entity=0, itriangle=0, ntriangle=0, length=0, iset=0, nset=0,
ok=0, ldum=0, idum[1], geometry_set[DATA_ITEM_SIZE];
double xi=0., tolerance=0., tmp=0., tmp1=0., a=0., b=0.,
xyint[2], ellilength=0.,
l0=0., l1=0., l2=0., x0=0., x1=0., y0=0., y1=0., l=0.,
radius=0., cylinder_length=0., x=0., y=0., z=0., eps_iso=EPS_ISO,
side[MDIM], geometry_bounda_sine_x[2], geometry_bounda_sine_y[2],
geometry_bounda_sine_z[2], coord[MDIM], dydx[MDIM],
ddum[1], weight[MNOL], tmp_vec[MDIM], point_first[MDIM], point_second[MDIM],
tmp_vec0[MDIM], tmp_vec1[MDIM], tmp_vec2[MDIM], tmp_vec11[MDIM],
tmp_vec3[MDIM], centre[MDIM], vec01[MDIM], vec02[MDIM], coord0[MDIM],
coord1[MDIM], coord2[MDIM], geometry_point[1*MDIM+1],
geometry_line[2*MDIM+1], geometry_triangle[2*(3*MDIM+1)],
geometry_circle[MDIM+2], geometry_circle_segment[MDIM+1+MDIM+1],
geometry_circle_smallsegment[MDIM+1+2*MDIM+1], geometry_quadrilateral[4*MDIM+1],
geometry_sphere[MDIM+2], geometry_sphere_segment[MDIM+1+MDIM+1],
geometry_cylinder[2*MDIM+2], geometry_cylinder_segment[MDIM+MDIM+1+MDIM+1],
geometry_ellipse[MDIM+3], geometry_bounda_factor[4],
geometry_brick[2*MDIM+1], work[MDIM],
*node_dof=NULL, *geometry_polynomial=NULL;
factor = 1.;
in_geometry = 0;
array_set( normal, 0., MDIM );
array_set( vec01, 0., MDIM );
array_set( vec02, 0., MDIM );
entity = geometry_entity[0];
index = geometry_entity[1];
if ( inod>=0 ) {
if ( node_type==PLUS_DISPLACEMENT ) {
db( NODE, inod, idum, coord, ldum, version, GET );
if ( materi_displacement ) {
node_dof = db_dbl( NODE_DOF, inod, version );
for ( idim=0; idim<ndim; idim++ )
coord[idim] += node_dof[dis_indx+idim*nder];
}
}
else
db( node_type, inod, idum, coord, ldum, version, GET );
}
else
array_move( co, coord, ndim );
if ( entity==-GEOMETRY_SET ) {
db( GEOMETRY_SET, index, geometry_set, ddum, nset, VERSION_NORMAL, GET );
nset = nset / 2;
}
else {
geometry_set[0] = entity;
geometry_set[1] = index;
nset = 1;
}
for ( iset=0; iset<nset && !in_geometry; iset++ ) {
entity = geometry_set[iset*2];
index = geometry_set[iset*2+1];
if ( entity==-GEOMETRY_BRICK ) {
db( GEOMETRY_BRICK, index, idum, geometry_brick,
ldum, VERSION_NORMAL, GET );
tolerance = geometry_brick[2*MDIM];
ok = 1;
for ( idim=0; idim<MDIM; idim++ ) {
if ( coord[idim] < geometry_brick[idim]-
geometry_brick[MDIM+idim]/2.-tolerance )
ok = 0;
if ( coord[idim] > geometry_brick[idim]+
geometry_brick[MDIM+idim]/2.+tolerance )
ok = 0;
}
if ( ok ) in_geometry = 1;
for ( idim=0; idim<MDIM; idim++ ) {
if ( coord[idim] < geometry_brick[idim] )
tmp = geometry_brick[idim]-geometry_brick[MDIM+idim];
if ( coord[idim] > geometry_brick[idim] )
tmp = geometry_brick[idim]+geometry_brick[MDIM+idim];
projection[idim] = tmp;
}
}
if ( entity==-GEOMETRY_CIRCLE ) {
db( GEOMETRY_CIRCLE, index, idum, geometry_circle,
ldum, VERSION_NORMAL, GET );
array_move( geometry_circle, centre, ndim );
radius = geometry_circle[ndim];
tolerance = geometry_circle[ndim+1];
array_subtract( coord, centre, tmp_vec1, ndim );
tmp = array_size( tmp_vec1, ndim );
if ( projection_type==CONTROL_MESH_DELETE_GEOMETRY ) {
if ( tmp<=(radius+tolerance+EPS_COORD) ) in_geometry = 1;
}
else {
if ( tmp>=(radius-tolerance-EPS_COORD) &&
tmp<=(radius+tolerance+EPS_COORD) ) in_geometry = 1;
}
array_move( tmp_vec1, normal, ndim );
array_normalize( normal, ndim );
penetration = tmp - radius;
for ( idim=0; idim<ndim; idim++ ) {
if ( tmp<EPS_COORD )
projection[idim] = centre[idim];
else
projection[idim] = centre[idim] +
(radius/tmp)*tmp_vec1[idim];
}
}
else if ( entity==-GEOMETRY_CIRCLE_SEGMENT ) {
db( GEOMETRY_CIRCLE_SEGMENT, index, idum, geometry_circle_segment,
ldum, VERSION_NORMAL, GET );
array_move( geometry_circle_segment, centre, ndim );
radius = geometry_circle_segment[ndim];
side[0] = geometry_circle_segment[ndim+1];
side[1] = geometry_circle_segment[ndim+2];
tolerance = geometry_circle_segment[ndim+3];
array_subtract( coord, centre, tmp_vec1, ndim );
tmp = array_size( tmp_vec1, ndim );
ok = 0;
if ( projection_type==CONTROL_MESH_DELETE_GEOMETRY ) {
if ( tmp<=(radius+tolerance+EPS_COORD) )
ok = 1;
}
else {
if ( tmp>=(radius-tolerance-EPS_COORD) &&
tmp<=(radius+tolerance+EPS_COORD) )
ok = 1;
}
for ( idim=0; idim<ndim; idim++ ) {
if ( side[idim]>0. && tmp_vec1[idim]<0. ) ok = 0;
if ( side[idim]<0. && tmp_vec1[idim]>0. ) ok = 0;
}
if ( ok ) in_geometry = 1;
array_move( tmp_vec1, normal, ndim );
array_normalize( normal, ndim );
penetration = tmp - radius;
for ( idim=0; idim<ndim; idim++ ) {
if ( tmp<EPS_COORD )
projection[idim] = centre[idim];
else
projection[idim] = centre[idim] +
(radius/tmp)*tmp_vec1[idim];
}
}
else if ( entity==-GEOMETRY_CIRCLE_SMALLSEGMENT ) {
db( GEOMETRY_CIRCLE_SMALLSEGMENT, index, idum, geometry_circle_smallsegment,
ldum, VERSION_NORMAL, GET );
array_move( geometry_circle_smallsegment, centre, ndim );
radius = geometry_circle_smallsegment[ndim];
array_move( &geometry_circle_smallsegment[ndim+1], point_first, ndim );
array_move( &geometry_circle_smallsegment[ndim+1+ndim], point_second, ndim );
tolerance = geometry_circle_smallsegment[ndim+1+2*ndim];
array_subtract( coord, centre, tmp_vec1, ndim );
tmp = array_size( tmp_vec1, ndim );
ok = 0;
if ( projection_type==CONTROL_MESH_DELETE_GEOMETRY ) {
if ( tmp<=(radius+tolerance+EPS_COORD) )
ok = 1;
}
else {
if ( tmp>=(radius-tolerance-EPS_COORD) &&
tmp<=(radius+tolerance+EPS_COORD) )
ok = 1;
}
for ( idim=0; idim<ndim; idim++ ) {
if ( coord[idim]>point_first[idim] && coord[idim]>point_second[idim] ) ok = 0;
if ( coord[idim]<point_first[idim] && coord[idim]<point_second[idim] ) ok = 0;
}
if ( ok ) in_geometry = 1;
array_move( tmp_vec1, normal, ndim );
array_normalize( normal, ndim );
penetration = tmp - radius;
for ( idim=0; idim<ndim; idim++ ) {
if ( tmp<EPS_COORD )
projection[idim] = centre[idim];
else
projection[idim] = centre[idim] +
(radius/tmp)*tmp_vec1[idim];
}
}
else if ( entity==-GEOMETRY_CYLINDER ) {
db( GEOMETRY_CYLINDER, index, idum, geometry_cylinder,
ldum, VERSION_NORMAL, GET );
array_subtract( &geometry_cylinder[3],
&geometry_cylinder[0], tmp_vec0, ndim);
if ( array_null( tmp_vec0, ndim ) )
db_error( GEOMETRY_CYLINDER, index );
cylinder_length = array_size( tmp_vec0, ndim );
array_normalize( tmp_vec0, ndim );
array_subtract( coord, &geometry_cylinder[0], tmp_vec1, ndim );
l = array_inproduct( tmp_vec1, tmp_vec0, ndim );
radius = geometry_cylinder[6];
tolerance = geometry_cylinder[7];
array_multiply( tmp_vec0, tmp_vec0, l, ndim );
array_subtract( tmp_vec1, tmp_vec0, tmp_vec2, ndim );
tmp = array_size( tmp_vec2, ndim );
if ( l>=-EPS_COORD && l<=cylinder_length+EPS_COORD ) {
if ( projection_type==CONTROL_MESH_DELETE_GEOMETRY ) {
if ( tmp<=(radius+tolerance+EPS_COORD) )
in_geometry = 1;
}
else {
if ( tmp>=(radius-tolerance-EPS_COORD) &&
tmp<=(radius+tolerance+EPS_COORD) )
in_geometry = 1;
}
}
array_move( tmp_vec2, normal, ndim );
array_normalize( normal, ndim );
penetration = tmp - radius;
for ( idim=0; idim<ndim; idim++ ) {
if ( tmp<EPS_COORD )
projection[idim] = tmp_vec0[idim]+geometry_cylinder[idim];
else
projection[idim] = tmp_vec0[idim] +geometry_cylinder[idim]+
(radius/tmp)*tmp_vec2[idim];
}
}
else if ( entity==-GEOMETRY_CYLINDER_SEGMENT ) {
db( GEOMETRY_CYLINDER_SEGMENT, index, idum, geometry_cylinder_segment,
ldum, VERSION_NORMAL, GET );
array_subtract( &geometry_cylinder_segment[3],
&geometry_cylinder_segment[0], tmp_vec0, ndim);
if ( array_null( tmp_vec0, ndim ) )
db_error( GEOMETRY_CYLINDER_SEGMENT, index );
cylinder_length = array_size( tmp_vec0, ndim );
array_normalize( tmp_vec0, ndim );
array_subtract( coord, &geometry_cylinder_segment[0], tmp_vec1, ndim );
l = array_inproduct( tmp_vec1, tmp_vec0, ndim );
radius = geometry_cylinder_segment[6];
side[0] = geometry_cylinder_segment[7];
side[1] = geometry_cylinder_segment[8];
side[2] = geometry_cylinder_segment[9];
tolerance = geometry_cylinder_segment[10];
array_multiply( tmp_vec0, tmp_vec0, l, ndim );
array_subtract( tmp_vec1, tmp_vec0, tmp_vec2, ndim );
tmp = array_size( tmp_vec2, ndim );
if ( l>=-EPS_COORD && l<=cylinder_length+EPS_COORD ) {
ok = 0;
if ( projection_type==CONTROL_MESH_DELETE_GEOMETRY ) {
if ( tmp<=(radius+tolerance+EPS_COORD) )
ok = 1;
}
else {
if ( tmp>=(radius-tolerance-EPS_COORD) &&
tmp<=(radius+tolerance+EPS_COORD) )
ok = 1;
}
for ( idim=0; idim<ndim; idim++ ) {
if ( side[idim]>0. && tmp_vec1[idim]<0. ) ok = 0;
if ( side[idim]<0. && tmp_vec1[idim]>0. ) ok = 0;
}
if ( ok ) in_geometry = 1;
}
array_move( tmp_vec2, normal, ndim );
array_normalize( normal, ndim );
penetration = tmp - radius;
for ( idim=0; idim<ndim; idim++ ) {
if ( tmp<EPS_COORD )
projection[idim] = tmp_vec0[idim]+geometry_cylinder_segment[idim];
else
projection[idim] = tmp_vec0[idim] +geometry_cylinder_segment[idim]+
(radius/tmp)*tmp_vec2[idim];
}
}
// Ellipse contact analysis was modified and corrected by Fernando Lorenzo June 22, 2012
else if ( entity==-GEOMETRY_ELLIPSE ) {
db( GEOMETRY_ELLIPSE, index, idum, geometry_ellipse,
ldum, VERSION_NORMAL, GET );
array_move( geometry_ellipse, centre, ndim );
// Parameters of the ellipse
a = geometry_ellipse[ndim];
b = geometry_ellipse[ndim+1];
if ( a<=0. || b<=0. ) db_error( GEOMETRY_ELLIPSE, index );
tolerance = geometry_ellipse[ndim+2];
// Coordinates of the nodal point with respect to the center of the ellipse
// Equivalent to displacing the origin of the ellipse to ease the calculations
x = coord[0] - centre[0];
y = coord[1] - centre[1];
polength=sqrt(x*x+y*y);
// xyint[0], xyint[1] contain the intersection of a line from the center of the ellipse
// to the ellipse
xyint[0]=(a*b*coord[0])/(sqrt((a*a)*(coord[1]*coord[1])+(b*b)*(coord[0]*coord[0])));
xyint[1]=(a*b*coord[1])/(sqrt((a*a)*(coord[1]*coord[1])+(b*b)*(coord[0]*coord[0])));
// ellilength is the distance equivalent to the radius of a circle
ellilength=sqrt(xyint[0]*xyint[0]+xyint[1]*xyint[1]);
// tmp contains the distance from the center of the ellipse to the node
array_subtract( coord, centre, tmp_vec1, ndim );
tmp = array_size( tmp_vec1, ndim );
// tmp11 contains the distance from the center of the ellipse to point on the ellipse
array_subtract( xyint, centre, tmp_vec11, ndim );
tmp1 = array_size( tmp_vec1, ndim );
if ( projection_type==CONTROL_MESH_DELETE_GEOMETRY ) {
if ( tmp<=(tmp1+tolerance +EPS_COORD) ) in_geometry = 1;
}
else {
if ( tmp>=(tmp1 -tolerance-EPS_COORD) &&
tmp<=(tmp1+tolerance+EPS_COORD) ) in_geometry = 1;
}
if ( y==0. ) {
if ( x>0. ) {
normal[0] = 1.;
normal[1] = 0.;
}
else {
normal[0] = -1.;
normal[1] = 0.;
}
}
else if ( x==0. ) {
if ( y>0. ) {
normal[0] = 0.;
normal[1] = 1.;
}
else {
normal[0] = 0.;
normal[1] = -1.;
}
}
else {
normal[0] = (b*xyint[0])/a;
normal[1] = (a*xyint[1])/b;
array_normalize( normal, ndim );
}
array_move( tmp_vec1, normal, ndim );
array_normalize( normal, ndim );
penetration = tmp - ellilength;
for ( idim=0; idim<ndim; idim++ ) {
if ( tmp<EPS_COORD )
projection[idim] = centre[idim];
else
projection[idim] = centre[idim] +
(ellilength/tmp)*tmp_vec1[idim];
}
}
else if ( entity==-GEOMETRY_LINE ) {
db( GEOMETRY_LINE, index, idum, geometry_line,
ldum, VERSION_NORMAL, GET );
array_subtract( coord, &geometry_line[0], tmp_vec1, ndim );
array_subtract( &geometry_line[ndim], &geometry_line[0], vec01, ndim );
if ( array_null(vec01,ndim) ) db_error( GEOMETRY_LINE, index );
xi = array_inproduct( tmp_vec1, vec01, ndim ) /
array_inproduct( vec01, vec01, ndim );
array_multiply( vec01, tmp_vec1, xi, ndim );
array_add( &geometry_line[0], tmp_vec1, tmp_vec2, ndim );
array_subtract( coord, tmp_vec2, tmp_vec1, ndim );
tmp = array_size( tmp_vec1, ndim );
tolerance = geometry_line[2*ndim];
if ( xi>=-EPS_ISO && xi<=(1.+EPS_ISO) &&
tmp<=tolerance+EPS_COORD ) in_geometry = 1;
if ( ndim==2 ) {
array_outproduct_2D( vec01, normal );
array_normalize( normal, ndim );
penetration = array_inproduct( normal, tmp_vec1, ndim );
}
if ( db_active_index( GEOMETRY_BOUNDA_FACTOR, index, VERSION_NORMAL ) ) {
db( GEOMETRY_BOUNDA_FACTOR, index, idum,
geometry_bounda_factor, length_geometry_bounda_factor,
VERSION_NORMAL, GET );
if ( length_geometry_bounda_factor==2 )
factor = geometry_bounda_factor[0] * (1.-xi) +
geometry_bounda_factor[1] * xi;
else {
assert( length_geometry_bounda_factor==3 );
xi = 2.*xi - 1.;
factor = geometry_bounda_factor[0] * 0.5 *( xi*xi - xi ) +
geometry_bounda_factor[1] * ( 1. - xi*xi ) +
geometry_bounda_factor[2] * 0.5 * ( xi*xi + xi );
}
}
for ( idim=0; idim<ndim; idim++ ) {
if ( projection_type==PROJECT_EXACT || tmp<EPS_COORD)
projection[idim] = tmp_vec2[idim];
else {
projection[idim] = tmp_vec2[idim] + (tolerance/tmp)*tmp_vec1[idim];
}
}
}
else if ( entity==-GEOMETRY_POINT ) {
db( GEOMETRY_POINT, index, idum, geometry_point,
ldum, VERSION_NORMAL, GET );
array_subtract( coord, geometry_point, tmp_vec1, ndim );
tmp = array_size( tmp_vec1, ndim );
tolerance = geometry_point[1*ndim];
if ( tmp<=tolerance+EPS_COORD ) in_geometry = 1;
array_move( tmp_vec1, normal, ndim );
array_normalize( normal, ndim );
penetration = tmp - tolerance;
for ( idim=0; idim<ndim; idim++ ) {
if ( projection_type==PROJECT_EXACT || tmp<EPS_COORD )
projection[idim] = geometry_point[idim];
else
projection[idim] = geometry_point[idim] +
(tolerance/tmp)*tmp_vec1[idim];
}
}
else if ( entity==-GEOMETRY_POLYNOMIAL ) {
length = db_len( GEOMETRY_POLYNOMIAL, index, VERSION_NORMAL );
if ( length<((ndim-1)*2+2) ) db_error( GEOMETRY_POLYNOMIAL, index );
geometry_polynomial =
db_dbl( GEOMETRY_POLYNOMIAL, index, VERSION_NORMAL );
if ( ndim==2 ) {
x = coord[0];
x0 = geometry_polynomial[length-3];
x1 = geometry_polynomial[length-2];
tolerance = geometry_polynomial[length-1];
if ( x>=x0 && x<=x1 ) {
y = geometry_polynomial[0];
for ( j=level=1; j<(length-3); level++ ) {
y += geometry_polynomial[j] * scalar_power(x,level); j++;
}
dydx[0] = 1.; dydx[1] = geometry_polynomial[1]; dydx[2] = 0.;
for ( j=level=2; j<(length-3); level++ ) {
dydx[1] +=
level * geometry_polynomial[j] * scalar_power(x,level-1); j++;
}
if ( coord[1]>=(y-tolerance-EPS_COORD) &&
coord[1]<=(y+tolerance+EPS_COORD) ) in_geometry = 1;
normal[1] = 1.;
penetration = coord[1] - y;
if ( projection_type==PROJECT_EXACT ) {
projection[0] = x; projection[1] = y;
}
else if ( coord[1]>y ) {
projection[0] = x; projection[1] = y+tolerance;
}
else {
projection[0] = x; projection[1] = y-tolerance;
}
}
}
else {
assert( ndim==3 );
x = coord[0];
y = coord[1];
x0 = geometry_polynomial[length-5];
x1 = geometry_polynomial[length-4];
y0 = geometry_polynomial[length-3];
y1 = geometry_polynomial[length-2];
tolerance = geometry_polynomial[length-1];
if ( x>=x0 && x<=x1 && y>=y0 && y<=y1 ) {
j = 0;
z = geometry_polynomial[j]; j++;
for ( level=1; j<(length-5); level++ ) {
if ( j<(length-5) ) {
z += geometry_polynomial[j] * scalar_power(x,level); j++;
}
for ( i=level-1; i>0 && j<(length-5); i-- ) {
z += geometry_polynomial[j] * scalar_power(x,i) *
scalar_power(y,level-i); j++;
}
if ( j<(length-5) ) {
z+= geometry_polynomial[j] * scalar_power(y,level); j++;
}
}
if ( coord[2]>=(z-tolerance-EPS_COORD) &&
coord[2]<=(z+tolerance+EPS_COORD) ) in_geometry = 1;
normal[2] = 1.;
penetration = coord[2] - z;
if ( projection_type==PROJECT_EXACT ) {
projection[0] = x; projection[1] = y; projection[2] = z;
}
else if ( coord[2]>z ) {
projection[0] = x; projection[1] = y; projection[2] = z+tolerance;
}
else {
projection[0] = x; projection[1] = y; projection[2] = z-tolerance;
}
}
}
}
else if ( entity==-GEOMETRY_SPHERE ) {
db( GEOMETRY_SPHERE, index, idum, geometry_sphere,
ldum, VERSION_NORMAL, GET );
radius = geometry_sphere[3];
tolerance = geometry_sphere[4];
array_move( geometry_sphere, centre, ndim );
array_subtract( coord, centre, tmp_vec1, ndim );
tmp = array_size( tmp_vec1, ndim );
if ( projection_type==CONTROL_MESH_DELETE_GEOMETRY ) {
if ( tmp<=(radius+tolerance+EPS_COORD) )
in_geometry = 1;
}
else {
if ( tmp>=(radius-tolerance-EPS_COORD) &&
tmp<=(radius+tolerance+EPS_COORD) )
in_geometry = 1;
}
array_move( tmp_vec1, normal, ndim );
array_normalize( normal, ndim );
penetration = tmp - radius;
for ( idim=0; idim<ndim; idim++ ) {
if ( tmp<EPS_COORD )
projection[idim] = centre[idim];
else
projection[idim] = centre[idim] +
(radius/tmp)*tmp_vec1[idim];
}
}
else if ( entity==-GEOMETRY_SPHERE_SEGMENT ) {
db( GEOMETRY_SPHERE_SEGMENT, index, idum, geometry_sphere_segment,
ldum, VERSION_NORMAL, GET );
radius = geometry_sphere_segment[3];
side[0] = geometry_sphere_segment[4];
side[1] = geometry_sphere_segment[5];
side[2] = geometry_sphere_segment[6];
tolerance = geometry_sphere_segment[7];
array_move( geometry_sphere_segment, centre, ndim );
array_subtract( coord, centre, tmp_vec1, ndim );
tmp = array_size( tmp_vec1, ndim );
ok = 0;
if ( projection_type==CONTROL_MESH_DELETE_GEOMETRY ) {
if ( tmp<=(radius+tolerance+EPS_COORD) )
ok = 1;
}
else {
if ( tmp>=(radius-tolerance-EPS_COORD) &&
tmp<=(radius+tolerance+EPS_COORD) )
ok = 1;
}
for ( idim=0; idim<ndim; idim++ ) {
if ( side[idim]>0. && tmp_vec1[idim]<0. ) ok = 0;
if ( side[idim]<0. && tmp_vec1[idim]>0. ) ok = 0;
}
if ( ok ) in_geometry = 1;
array_move( tmp_vec1, normal, ndim );
array_normalize( normal, ndim );
penetration = tmp - radius;
for ( idim=0; idim<ndim; idim++ ) {
if ( tmp<EPS_COORD )
projection[idim] = centre[idim];
else
projection[idim] = centre[idim] +
(radius/tmp)*tmp_vec1[idim];
}
}
else if ( entity==-GEOMETRY_TRIANGLE || entity==-GEOMETRY_QUADRILATERAL ) {
if ( entity==-GEOMETRY_TRIANGLE ) {
ntriangle = 1;
db( GEOMETRY_TRIANGLE, index, idum, geometry_triangle,
ldum, VERSION_NORMAL, GET );
eps_iso = EPS_ISO;
db( GEOMETRY_TRIANGLE_EPSISO, index, idum, &eps_iso,
ldum, VERSION_NORMAL, GET_IF_EXISTS );
}
else {
ntriangle = 2;
db( GEOMETRY_QUADRILATERAL, index, idum, geometry_quadrilateral,
ldum, VERSION_NORMAL, GET );
for ( idim=0; idim<ndim; idim++ ) {
// first triangle
ind = 0*(3*ndim+1);
geometry_triangle[ind+0*ndim+idim] =
geometry_quadrilateral[0*ndim+idim];
geometry_triangle[ind+1*ndim+idim] =
geometry_quadrilateral[1*ndim+idim];
geometry_triangle[ind+2*ndim+idim] =
geometry_quadrilateral[2*ndim+idim];
// second triangle
ind = 1*(3*ndim+1);
geometry_triangle[ind+0*ndim+idim] =
geometry_quadrilateral[1*ndim+idim];
geometry_triangle[ind+1*ndim+idim] =
geometry_quadrilateral[2*ndim+idim];
geometry_triangle[ind+2*ndim+idim] =
geometry_quadrilateral[3*ndim+idim];
}
ind = 0*(3*ndim+1);
geometry_triangle[ind+3*ndim] = geometry_quadrilateral[4*ndim];
ind = 1*(3*ndim+1);
geometry_triangle[ind+3*ndim] = geometry_quadrilateral[4*ndim];
}
for ( itriangle=0; itriangle<ntriangle && !in_geometry; itriangle++ ) {
ind = itriangle*(3*ndim+1);
itest = project_point_on_triangle( coord, &geometry_triangle[ind+0*ndim],
&geometry_triangle[ind+1*ndim], &geometry_triangle[ind+2*ndim],
weight );
l0 = weight[0];
l1 = weight[1];
l2 = weight[2];
array_multiply( &geometry_triangle[ind+0*ndim], tmp_vec1,
l0, ndim );
array_multiply( &geometry_triangle[ind+1*ndim], tmp_vec2,
l1, ndim );
array_add( tmp_vec1, tmp_vec2, tmp_vec1, ndim );
array_multiply( &geometry_triangle[ind+2*ndim], tmp_vec2,
l2, ndim );
array_add( tmp_vec1, tmp_vec2, tmp_vec3, ndim );
array_subtract( coord, tmp_vec3, tmp_vec2, ndim );
tmp = array_size( tmp_vec2, ndim );
tolerance = geometry_triangle[ind+3*ndim];
if ( itest &&
l0>=-eps_iso && l0<(1.+eps_iso) &&
l1>=-eps_iso && l1<(1.+eps_iso) &&
l2>=-eps_iso && l2<(1.+eps_iso) ) {
if ( tmp<=tolerance ) in_geometry = 1;
}
array_move( &geometry_triangle[ind+0*ndim], coord0, ndim );
array_move( &geometry_triangle[ind+1*ndim], coord1, ndim );
array_move( &geometry_triangle[ind+2*ndim], coord2, ndim );
array_subtract( coord0, coord1, vec01, ndim );
array_subtract( coord0, coord2, vec02, ndim );
array_outproduct_3D( vec01, vec02, normal );
array_normalize( normal, ndim );
penetration = array_inproduct( tmp_vec2, normal, ndim );
if ( db_active_index( GEOMETRY_BOUNDA_FACTOR, index,
VERSION_NORMAL ) ) {
if ( entity==-GEOMETRY_TRIANGLE )
length = 3;
else {
assert( entity==-GEOMETRY_QUADRILATERAL );
length = 4;
}
db( GEOMETRY_BOUNDA_FACTOR, index, idum,
geometry_bounda_factor, length, VERSION_NORMAL, GET_AND_CHECK );
if ( itriangle==0 ) {
factor = geometry_bounda_factor[0] * l0 +
geometry_bounda_factor[1] * l1 +
geometry_bounda_factor[2] * l2;
}
else {
assert( itriangle==1 );
factor = geometry_bounda_factor[1] * l0 +
geometry_bounda_factor[2] * l1 +
geometry_bounda_factor[3] * l2;
}
}
for ( idim=0; idim<ndim; idim++ ) {
if ( projection_type==PROJECT_EXACT || tmp<EPS_COORD )
projection[idim] = tmp_vec3[idim];
else {
projection[idim] = tmp_vec3[idim] +
(tolerance/tmp)*tmp_vec2[idim];
}
}
}
}
else if ( entity==-NODE_BOUNDARY ) {
area_node_dataitem();
if ( db_active_index( NODE_BOUNDARY, inod, version ) )
in_geometry = 1;
else
in_geometry = 0;
}
if ( in_geometry ) {
if ( db_active_index( GEOMETRY_BOUNDA_SINE_X, index, VERSION_NORMAL ) ) {
db( GEOMETRY_BOUNDA_SINE_X, index, idum, geometry_bounda_sine_x,
ldum, VERSION_NORMAL, GET );
a = geometry_bounda_sine_x[0];
b = geometry_bounda_sine_x[1];
factor *= sin(a+b*coord[0]);
}
if ( db_active_index( GEOMETRY_BOUNDA_SINE_Y, index, VERSION_NORMAL ) ) {
db( GEOMETRY_BOUNDA_SINE_Y, index, idum, geometry_bounda_sine_y,
ldum, VERSION_NORMAL, GET );
a = geometry_bounda_sine_y[0];
b = geometry_bounda_sine_y[1];
factor *= sin(a+b*coord[1]);
}
if ( db_active_index( GEOMETRY_BOUNDA_SINE_Z, index, VERSION_NORMAL ) ) {
db( GEOMETRY_BOUNDA_SINE_Z, index, idum, geometry_bounda_sine_z,
ldum, VERSION_NORMAL, GET );
a = geometry_bounda_sine_z[0];
b = geometry_bounda_sine_z[1];
factor *= sin(a+b*coord[2]);
}
}
}
}
void interpolate_geometry( long int geometry_entity[],
long int node_numbers[], long int n, double test_coord[],
double new_coord[], double test_coord_start_refined[],
double new_coord_start_refined[],
long int project_type, long int version )
{
long int i=0, inod=0, part_of_same_geometry=0, in_geometry=0,
i_geometry_entity=0, n_geometry_entity=0, geometry_entities[DATA_ITEM_SIZE];
double rdum=0., ddum[MDIM], test_co[MDIM], new_co[MDIM], diff_co[MDIM];
if ( geometry_entity[0]==-GEOMETRY_SET ) {
db( GEOMETRY_SET, geometry_entity[1], geometry_entities, ddum,
n_geometry_entity, VERSION_NORMAL, GET );
n_geometry_entity /= 2;
}
else {
array_move( geometry_entity, geometry_entities, 2 );
n_geometry_entity = 1;
}
for ( i_geometry_entity=0; i_geometry_entity<n_geometry_entity; i_geometry_entity++ ) {
if ( n>0 ) {
array_move( test_coord_start_refined, test_co, ndim );
part_of_same_geometry = 1;
for ( i=0; i<n && part_of_same_geometry; i++ ) {
inod = node_numbers[i];
geometry( inod, ddum, &geometry_entities[i_geometry_entity*2],
in_geometry, rdum, ddum, rdum, ddum, NODE_START_REFINED, project_type, version );
part_of_same_geometry = part_of_same_geometry && in_geometry;
}
}
if ( part_of_same_geometry ) {
geometry( -1, test_co, &geometry_entities[i_geometry_entity*2],
in_geometry, rdum, ddum, rdum, new_co, NODE_START_REFINED, project_type, version );
array_subtract( new_co, test_co, diff_co, ndim );
array_move( new_co, new_coord_start_refined, ndim );
array_add( test_coord, diff_co, new_coord, ndim );
}
}
}
void parallel_geometry( void )
{
long int inod=0, max_node=0, found=0, iloop=0, nloop=0, swit=0,
ithread=0, *next_of_loop=NULL;
double factor=0., rdum=0., ddum[MDIM];
swit = set_swit(-1,-1,"parallel_geometry");
if ( swit ) pri( "In routine PARALLEL_GEOMETRY" );
db_max_index( NODE, max_node, VERSION_NORMAL, GET );
if ( max_node>=0 ) {
next_of_loop = get_new_int(100+max_node);
parallel_sys_next_of_loop( next_of_loop, max_node, nloop, ithread );
for ( iloop=0; iloop<nloop; iloop++ ) {
inod = next_of_loop[iloop];
if ( inod>max_node ) {
break;
}
else {
if ( db_active_index( NODE, inod, VERSION_NORMAL ) ) {
geometry( inod, ddum, geometry_ent, found, factor, ddum, rdum,
ddum, NODE_START_REFINED, PROJECT_EXACT, VERSION_NORMAL );
if ( found ) nodes_in_geometry[inod] = 1;
}
}
}
delete[] next_of_loop;
}
if ( swit ) pri( "Out routine PARALLEL_GEOMETRY" );
}
--Apple-Mail=_AC3CDE14-3029-420B-B4DA-50E73D9655CE
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=us-ascii
Fernando Lorenzo
[email protected]
--Apple-Mail=_AC3CDE14-3029-420B-B4DA-50E73D9655CE
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
--Apple-Mail=_AC3CDE14-3029-420B-B4DA-50E73D9655CE
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
Tochnog-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tochnog-users
--Apple-Mail=_AC3CDE14-3029-420B-B4DA-50E73D9655CE--