hide long namesshow long names
hide short namesshow short names
Integer type:  int32  int64  nag_int  show int32  show int32  show int64  show int64  show nag_int  show nag_int

PDF version (NAG web site, 64-bit version, 64-bit version)
Chapter Contents
Chapter Introduction
NAG Toolbox

NAG Toolbox: nag_mesh_2d_transform_affine (d06da)

Purpose

nag_mesh_2d_transform_affine (d06da) is a utility which performs an affine transformation of a given mesh.

Syntax

[coori, edgei, conni, cooro, edgeo, conno, ifail] = d06da(itype, trans, coori, edgei, conni, itrace, 'nv', nv, 'nedge', nedge, 'nelt', nelt, 'ntrans', ntrans)
[coori, edgei, conni, cooro, edgeo, conno, ifail] = nag_mesh_2d_transform_affine(itype, trans, coori, edgei, conni, itrace, 'nv', nv, 'nedge', nedge, 'nelt', nelt, 'ntrans', ntrans)

Description

nag_mesh_2d_transform_affine (d06da) generates a mesh (coordinates, triangle/vertex connectivities and edge/vertex connectivities) resulting from an affine transformation of a given mesh. This transformation is of the form Y = A × X + BY=A×X+B, where
Such a transformation includes a translation, a rotation, a scale reduction or increase, a symmetric transformation with respect to a user-supplied line, a user-supplied analytic transformation, or a composition of several transformations.
This function is partly derived from material in the MODULEF package from INRIA (Institut National de Recherche en Informatique et Automatique).

References

None.

Parameters

Compulsory Input Parameters

1:     itype(ntrans) – int64int32nag_int array
ntrans, the dimension of the array, must satisfy the constraint ntrans1ntrans1.
itype(i)itypei, for i = 1,2,,ntransi=1,2,,ntrans, indicates the type of each transformation as follows:
itype(i) = 0itypei=0
Identity transformation.
itype(i) = 1itypei=1
Translation.
itype(i) = 2itypei=2
Symmetric transformation with respect to a user-supplied line.
itype(i) = 3itypei=3
Rotation.
itype(i) = 4itypei=4
Scaling.
itype(i) = 10itypei=10
User-supplied analytic transformation.
Note that the transformations are applied in the order described in itype.
Constraint: itype(i) = 0itypei=0, 11, 22, 33, 44 or 1010, for i = 1,2,,ntransi=1,2,,ntrans.
2:     trans(66,ntrans) – double array
The parameters for each transformation. For i = 1,2,,ntransi=1,2,,ntrans, trans(1,i)trans1i to trans(6,i)trans6i contain the parameters of the iith transformation.
If itype(i) = 0itypei=0, elements trans(1,i)trans1i to trans(6,i)trans6i are not referenced.
If itype(i) = 1itypei=1, the translation vector is u =
(a)
b
u= a b , where a = trans(1,i)a=trans1i and b = trans(2,i)b=trans2i, while elements trans(3,i)trans3i to trans(6,i)trans6i are not referenced.
If itype(i) = 2itypei=2, the user-supplied line is the curve {(x,y)2(x,y)2; such that ax + by + c = 0ax+by+c=0}, where a = trans(1,i)a=trans1i, b = trans(2,i)b=trans2i and c = trans(3,i)c=trans3i, while elements trans(4,i)trans4i to trans(6,i)trans6i are not referenced.
If itype(i) = 3itypei=3, the centre of the rotation is (x0,y0)(x0,y0) where x0 = trans(1,i)x0=trans1i and y0 = trans(2,i)y0=trans2i, θ = trans(3,i)θ=trans3i is its angle in degrees, while elements trans(4,i)trans4i to trans(6,i)trans6i are not referenced.
If itype(i) = 4itypei=4, a = trans(1,i)a=trans1i is the scaling coefficient in the xx-direction, b = trans(2,i)b=trans2i is the scaling coefficient in the yy-direction, and (x0,y0)(x0,y0) are the scaling centre coordinates, with x0 = trans(3,i)x0=trans3i and y0 = trans(4,i)y0=trans4i; while elements trans(5,i)trans5i to trans(6,i)trans6i are not referenced.
If itype(i) = 10itypei=10, the user-supplied analytic affine transformation Y = A × X + BY=A×X+B is such that A = (akl)1k,l2A=(akl)1k,l2 and B = (bk)1k2B=(bk)1k2 whereakl = trans(2 × (k1) + l,i)akl=trans2×(k-1)+li, and bk = trans(4 + k,i)bk=trans4+ki with k,l = 1,2k,l=1,2.
3:     coori(22,nv) – double array
coori(1,i)coori1i contains the xx coordinate of the iith vertex of the input mesh, for i = 1,2,,nvi=1,2,,nv; while coori(2,i)coori2i contains the corresponding yy coordinate.
4:     edgei(33,nedge) – int64int32nag_int array
The specification of the boundary or interface edges. edgei(1,j)edgei1j and edgei(2,j)edgei2j contain the vertex numbers of the two end points of the jjth boundary edge. edgei(3,j)edgei3j is a user-supplied tag for the jjth boundary edge.
Constraint: 1edgei(i,j)nv1edgeiijnv and edgei(1,j)edgei(2,j)edgei1jedgei2j, for i = 1,2i=1,2 and j = 1,2,,nedgej=1,2,,nedge.
5:     conni(33,nelt) – int64int32nag_int array
The connectivity of the input mesh between triangles and vertices. For each triangle jj, conni(i,j)conniij gives the indices of its three vertices (in anticlockwise order), for i = 1,2,3i=1,2,3 and j = 1,2,,neltj=1,2,,nelt.
Constraints:
  • 1conni(i,j)nv1conniijnv;
  • conni(1,j)conni(2,j)conni1jconni2j;
  • conni(1,j)conni(3,j)conni1jconni3j and conni(2,j)conni(3,j)conni2jconni3j, for i = 1,2,3i=1,2,3 and j = 1,2,,neltj=1,2,,nelt.
6:     itrace – int64int32nag_int scalar
The level of trace information required from nag_mesh_2d_transform_affine (d06da).
itrace0itrace0
No output is generated.
itrace1itrace1
Details of each transformation, the matrix AA and the vector BB of the final transformation, which is the composition of all the ntrans transformations, are printed on the current advisory message unit (see nag_file_set_unit_advisory (x04ab)).

Optional Input Parameters

1:     nv – int64int32nag_int scalar
Default: The dimension of the array coori.
The total number of vertices in the input mesh.
Constraint: nv3nv3.
2:     nedge – int64int32nag_int scalar
Default: The dimension of the array edgei.
The number of the boundary or interface edges in the input mesh.
Constraint: nedge1nedge1.
3:     nelt – int64int32nag_int scalar
Default: The dimension of the array conni.
The number of triangles in the input mesh.
Constraint: nelt2 × nv1nelt2×nv-1.
4:     ntrans – int64int32nag_int scalar
Default: The dimension of the arrays itype, trans. (An error is raised if these dimensions are not equal.)
The number of transformations of the input mesh.
Constraint: ntrans1ntrans1.

Input Parameters Omitted from the MATLAB Interface

rwork lrwork

Output Parameters

1:     coori(22,nv) – double array
2:     edgei(33,nedge) – int64int32nag_int array
3:     conni(33,nelt) – int64int32nag_int array
4:     cooro(22,nv) – double array
cooro(1,i)cooro1i will contain the xx coordinate of the iith vertex of the transformed mesh, for i = 1,2,,nvi=1,2,,nv; while cooro(2,i)cooro2i will contain the corresponding yy coordinate.
5:     edgeo(33,nedge) – int64int32nag_int array
The specification of the boundary or interface edges of the transformed mesh. If the number of symmetric transformations is even or zero thenedgeo(i,j) = edgei(i,j)edgeoij=edgeiij, for i = 1,2,3i=1,2,3 and j = 1,2,,nedgej=1,2,,nedge; otherwise edgeo(1,j) = edgei(2,j)edgeo1j=edgei2j,edgeo(2,j) = edgei(1,j)edgeo2j=edgei1j and edgeo(3,j) = edgei(3,j)edgeo3j=edgei3j, for j = 1,2,,nedgej=1,2,,nedge.
6:     conno(33,nelt) – int64int32nag_int array
The connectivity of the transformed mesh between triangles and vertices. If the number of symmetric transformations is even or zero thenconno(i,j) = conni(i,j)connoij=conniij, for i = 1,2,3i=1,2,3 and j = 1,2,,neltj=1,2,,nelt; otherwise conno(1,j) = conni(1,j)conno1j=conni1j, conno(2,j) = conni(3,j)conno2j=conni3j and conno(3,j) = conni(2,j)conno3j=conni2j, for j = 1,2,,neltj=1,2,,nelt.
7:     ifail – int64int32nag_int scalar
ifail = 0ifail=0 unless the function detects an error (see [Error Indicators and Warnings]).

Error Indicators and Warnings

Errors or warnings detected by the function:
  ifail = 1ifail=1
On entry,nv < 3nv<3;
ornelt > 2 × nv1nelt>2×nv-1;
ornedge < 1nedge<1;
oredgei(i,j) < 1edgeiij<1 or edgei(i,j) > nvedgeiij>nv for some i = 1,2i=1,2 and j = 1,2,,nedgej=1,2,,nedge;
oredgei(1,j) = edgei(2,j)edgei1j=edgei2j for some j = 1,2,,nedgej=1,2,,nedge;
orconni(i,j) < 1conniij<1 or conni(i,j) > nvconniij>nv for some i = 1,2,3i=1,2,3 and j = 1,2,,neltj=1,2,,nelt;
orconni(1,j) = conni(2,j)conni1j=conni2j or conni(1,j) = conni(3,j)conni1j=conni3j or
conni(2,j) = conni(3,j)conni2j=conni3j for some j = 1,2,,neltj=1,2,,nelt;
orntrans < 1ntrans<1;
oritype(i)0itypei0, 11, 22, 33, 44 or 1010 for some i = 1,2,,ntransi=1,2,,ntrans;
orlrwork < 12 × ntranslrwork<12×ntrans.
  ifail = 2ifail=2
A serious error has occurred in an internal call to an auxiliary function. Check the input mesh especially the triangles/vertices and the edges/vertices connectivities as well as the details of each transformations.

Accuracy

Not applicable.

Further Comments

You may not wish to save the input mesh (coori, edgei and conni) and could call nag_mesh_2d_transform_affine (d06da) using the same parameters for the input and the output (transformed) mesh.

Example

For an example of the use of this utility function, see Section [Example] in (d06db).
function nag_mesh_2d_transform_affine_example
coor1 = zeros(2,400);
for j = 1:20
  for i = 1:20
    coor1(1,(j-1)*20+i) = (i-1)/19;
    coor1(2,(j-1)*20+i) = (j-1)/19;
  end
end
edge1 = ones(3, 76, 'int64');
edge1(1, 1:76) = [int64(1),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, ...
    20,40,60,80,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380, ...
    400,399,398,397,396,395,394,393,392,391,390,389,388,387,386,385,384,383, ...
    382,381,361,341,321,301,281,261,241,221,201,181,161,141,121,101,81,61,41,21];
edge1(2, 1:76) = [ int64(2),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, ...
    20,40,60,80,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380, ...
    400,399,398,397,396,395,394,393,392,391,390,389,388,387,386,385,384,383, ...
    382,381,361,341,321,301,281,261,241,221,201,181,161,141,121,101,81,61,41,21,1];
conn1 = zeros(3, 722, 'int64');
ind = -1;
for i=1:379
  if (rem(i, 20) ~= 0)
    ind = ind+2;
    conn1(1, ind)   = int64(i);
    conn1(1, ind+1) = int64(i);
    conn1(2, ind)   = int64(i+1);
    conn1(2, ind+1) = int64(i+21);
    conn1(3, ind)   = int64(i+21);
    conn1(3, ind+1) = int64(i+20);
  end
end
reft1 = ones(722, 1, 'int64');
reft2 = reft1;
reft2(:) = int64(2);
itype = [int64(1)];
itrace = int64(0);

% Transform the first domain to obtain an overlapping second domain
trans = [15/19; 17/19; 0; 0; 0; 0];
[coor1, edge1, conn1, coor2, edge2, conn2, ifail] = ...
    nag_mesh_2d_transform_affine(itype, trans, coor1, edge1, conn1, itrace);

% Restitch the meshes
[nv3, nelt3, nedge3, coor3, edge3, conn3, reft3, ifail] = ...
     nag_mesh_2d_join(coor1, edge1, conn1, reft1, coor2, edge2, conn2, reft2, itrace);

% Plot the result
fig1 = figure('Number', 'off');
triplot(transpose(conn3(:,1:double(nelt3))), coor3(1,:), coor3(2,:));
title ('Interior mesh of the two overlapping squares geometry', 'FontSize', 14);

% Now consider a partitioned second domain
trans = [1; 0; 0; 0; 0; 0];
[coor1, edge1, conn1, coor2, edge2, conn2, ifail] = ...
    nag_mesh_2d_transform_affine(itype, trans, coor1, edge1, conn1, itrace);

% Restitch the meshes
[nv3, nelt3, nedge3, coor3, edge3, conn3, reft3, ifail] = ...
     nag_mesh_2d_join(coor1, edge1, conn1, reft1, coor2, edge2, conn2, reft2, itrace);
 ifail

% Plot the result
fig2 = figure('Number', 'off');
triplot(transpose(conn3(:,1:double(nelt3))), coor3(1,:), coor3(2,:));
title ('Interior mesh of the two partitioned squares geometry', 'FontSize', 14);
 

ifail =

                    0


function d06da_example
coor1 = zeros(2,400);
for j = 1:20
  for i = 1:20
    coor1(1,(j-1)*20+i) = (i-1)/19;
    coor1(2,(j-1)*20+i) = (j-1)/19;
  end
end
edge1 = ones(3, 76, 'int64');
edge1(1, 1:76) = [int64(1),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, ...
    20,40,60,80,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380, ...
    400,399,398,397,396,395,394,393,392,391,390,389,388,387,386,385,384,383, ...
    382,381,361,341,321,301,281,261,241,221,201,181,161,141,121,101,81,61,41,21];
edge1(2, 1:76) = [ int64(2),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, ...
    20,40,60,80,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380, ...
    400,399,398,397,396,395,394,393,392,391,390,389,388,387,386,385,384,383, ...
    382,381,361,341,321,301,281,261,241,221,201,181,161,141,121,101,81,61,41,21,1];
conn1 = zeros(3, 722, 'int64');
ind = -1;
for i=1:379
  if (rem(i, 20) ~= 0)
    ind = ind+2;
    conn1(1, ind)   = int64(i);
    conn1(1, ind+1) = int64(i);
    conn1(2, ind)   = int64(i+1);
    conn1(2, ind+1) = int64(i+21);
    conn1(3, ind)   = int64(i+21);
    conn1(3, ind+1) = int64(i+20);
  end
end
reft1 = ones(722, 1, 'int64');
reft2 = reft1;
reft2(:) = int64(2);
itype = [int64(1)];
itrace = int64(0);

% Transform the first domain to obtain an overlapping second domain
trans = [15/19; 17/19; 0; 0; 0; 0];
[coor1, edge1, conn1, coor2, edge2, conn2, ifail] = ...
    d06da(itype, trans, coor1, edge1, conn1, itrace);

% Restitch the meshes
[nv3, nelt3, nedge3, coor3, edge3, conn3, reft3, ifail] = ...
     d06db(coor1, edge1, conn1, reft1, coor2, edge2, conn2, reft2, itrace);

% Plot the result
fig1 = figure('Number', 'off');
triplot(transpose(conn3(:,1:double(nelt3))), coor3(1,:), coor3(2,:));
title ('Interior mesh of the two overlapping squares geometry', 'FontSize', 14);

% Now consider a partitioned second domain
trans = [1; 0; 0; 0; 0; 0];
[coor1, edge1, conn1, coor2, edge2, conn2, ifail] = ...
    d06da(itype, trans, coor1, edge1, conn1, itrace);

% Restitch the meshes
[nv3, nelt3, nedge3, coor3, edge3, conn3, reft3, ifail] = ...
     d06db(coor1, edge1, conn1, reft1, coor2, edge2, conn2, reft2, itrace);
 ifail

% Plot the result
fig2 = figure('Number', 'off');
triplot(transpose(conn3(:,1:double(nelt3))), coor3(1,:), coor3(2,:));
title ('Interior mesh of the two partitioned squares geometry', 'FontSize', 14);
 

ifail =

                    0



PDF version (NAG web site, 64-bit version, 64-bit version)
Chapter Contents
Chapter Introduction
NAG Toolbox

© The Numerical Algorithms Group Ltd, Oxford, UK. 2009–2013