#!/usr/bin/perl
# cast2aba.pl         SOURCE    LC    02/03/15
#
# [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
# CHAMPANEY Laurent  Universite de Versailles St Quentin le 15 / 03 / 02
#
# Transfert de fichiers maillage de CAST3M vers ABAQUS
#
#  Usage :
#    cast2aba.pl nom
#  
#  lit nom.sauv et le converti en nom.inp en utilisant les infos
#   contenues dans nom.c2a
#
#  pour avoir des infos : cast2aba.pl -h
#
# ======================================================================
#
#use strict "vars";
use Getopt::Long;
#
# Analyse des arguments
my @knownoptions = ("help|h",
                    "reduit|r",
		    "taille|t=f",
                    "verbose|v");
GetOptions (@knownoptions) || exit ;
my $verb1 = 0;
if ($opt_verbose){$verb1=1};
my $reduit1 = 0;
if ($opt_reduit){$reduit1=1};
if ($opt_help){sortie_usage(); exit();};

#
# Info generales
my $generic;
my $generic_ext;
my $line;
my $dime;
my $ifour;
# Les tableaux
my @noeuds;
my @points;
my @mail;
my %noms_mail;
my @mchaml;
my @chpo;
my @list_tabl;
my @list_pile;
my @liste_bord;
# Les Tableaux de correspondance
my @corresp_num_el;
# Les Tableaux de dimension
my @mail_tyel;
my @mail_nbel;
my @mail_nbno;
my @nb_comp_mchaml;
my @nb_comp_chpo;
# Initialisations
my @typ_el_cast = qw(POI0 POI1 SEG2 SEG3 TRI3 TRI4 TRI6 TRI7 QUA4 QUA5 QUA8 QUA9 RAC2 RAC3 CUB8 CU20 PRI6 PR15 LIA3 LIA4 LIA6 LIA8 MULT TET4 TE10 PYR5 PY13 ATTA SUPE RAP3 LIP6 LIP8 POLY CU27 PR21 TE15 PY19 SEG4 QU16 TR12 PR18 SEG6 TR21 QU36 C216 P126 TE56 PY91);
#
my $num_el_abaqus = 0;
my $coef1 = 2.;
if ($opt_taille) {$coef1 = $opt_taille};
#
# Correspondance elt cast3m/abaqus
my @corresp_typ_el;
# En axisymetrique
$corresp_typ_el[2][0] = "SAX1";
$corresp_typ_el[3][0] = "SAX2";
$corresp_typ_el[4][0] = "CAX3";
$corresp_typ_el[6][0] = "CAX6";
$corresp_typ_el[8][0] = "CAX4";
$corresp_typ_el[10][0] = "CAX8";
# En deformations planes
$corresp_typ_el[2][1] = "B21";
$corresp_typ_el[3][1] = "B23";
$corresp_typ_el[4][1] = "CPE3";
$corresp_typ_el[6][1] = "CPE6";
$corresp_typ_el[8][1] = "CPE4";
$corresp_typ_el[10][1] = "CPE8";
# En contraintes planes
$corresp_typ_el[2][2] = "B21";
$corresp_typ_el[3][2] = "B23";
$corresp_typ_el[4][2] = "CPS3";
$corresp_typ_el[6][2] = "CPS6";
$corresp_typ_el[8][2] = "CPS4";
$corresp_typ_el[10][2] = "CPS8";
# en 3D
$corresp_typ_el[2][3] = "B31";
$corresp_typ_el[3][3] = "B33";
$corresp_typ_el[4][3] = "S3";
$corresp_typ_el[6][3] = "STRI65";
$corresp_typ_el[8][3] = "S4";
$corresp_typ_el[10][3] = "S8R";
$corresp_typ_el[14][3] = "C3D8";
$corresp_typ_el[15][3] = "C3D20";
$corresp_typ_el[16][3] = "C3D6";
$corresp_typ_el[17][3] = "C3D15";
$corresp_typ_el[23][3] = "C3D4";
$corresp_typ_el[24][3] = "C3D10";
#
#
if($#ARGV==-1) { sortie_usage(); exit();}
else {
        ($generic , $generic_ext) = ( $ARGV[0] =~ /([-_\/\w]*)\.?(\w*)/ ) ;
}
#
my $fic = "$generic.sauv";
open( FIC, $fic) || die "\n$fic inexistant\n\n";
#
#
# Analyse du fichier de sauvegarde CAST3M et remplissage des Tableaux
#
if ($verb1) {print "\nLecture de $fic\n";};
while ($line = <FIC>) {
	if ($line =~ /NIVEAU.*DIMENSION\s*(\d*)/) {
		$dime = $1;
		if ($verb1) {print "  Dimension $dime\n";};
	};
	if ($line =~ /\sIFOUR\s*(\S*)\sNIFOUR.*/) {
		my $ifour0 = $1;
		if ($ifour0 == 0) {
			$ifour = 0;
			if ($verb1) {print "  Mode axisymétrique\n";};
		};
		if ($ifour0 == -1) {
			$ifour = 1;
			if ($verb1) {print "  Mode déformations planes\n";};
		};
		if ($ifour0 == -2) {
			$ifour = 2;
			if ($verb1) {print "  Mode contraintes planes\n";};
		};
		if ($ifour0 == 2) {
			$ifour = 3;
			if ($verb1) {print "  Mode tridimensionnel\n";};
		};
	};
	if ($line =~ /PILE NUMERO\s*(\d*)NBRE OBJETS NOMMES\s*(\d*)NBRE OBJETS\s*(\d*)/) {
		my $pile = $1;
		my $nommes1 = $2;
		my $objets1 = $3;
		#print "Pile $pile - objets nommes $nommes1 - objets $objets1\n";
#    PILE des coordonnees des noeuds
		if ($pile == 32) {{{
			if ($verb1) {print "  Lecture de la configurations : ";};
			my $nbsaut1 = int($nommes1 / 8);
			if ( $nommes1 % 8) {$nbsaut1 ++};
			my $nbsaut2 = int($nommes1 / 10);
			if ( $nommes1 % 10) {$nbsaut2 ++};
			my $nbsaut1 = ($nbsaut1 + $nbsaut2) + 1;
			for my $i (1 .. $nbsaut1) {$line = <FIC>};
			#print "$nbsaut1\n";
			my $nblus1 = int($objets1 / 10);
			if ( $objets1 % 10) {$nblus1 ++};
			#print "$nblus1\n";
			my $nbp1 = 0;
			for my $i (1 .. $nblus1) {
			  $line = <FIC>;
                          chomp($line);
			  my @temp1 = unpack ("A8" x (length($line)/8), $line);
			  for my $j (1 .. (length($line)/8)) {
			    my $nn1 = $temp1[$j - 1] + 0;
			    $noeuds[$nbp1] = $nn1;
			    #$noeuds[$nn1] = $nbp1;
			    $nbp1++;
			  };
			};
			if ($verb1) {print "$nbp1 noeuds lus\n";};
		}}};
#
#    PILE des configurations
		if ($pile == 33) {{{
			if ($verb1) {print "  Lecture des POINTs : ";};
			my $nbsaut1 = int($nommes1 / 8);
			if ( $nommes1 % 8) {$nbsaut1 ++};
			my $nbsaut1 = (2 * $nbsaut1 ) ;
			#print "$nbsaut1\n";
			#
			for my $i (1 .. $nbsaut1) {$line = <FIC>};
			$line = <FIC>;
			chomp($line);
			my $nblus1 = int($line / 3);
			if ( $line % 3) {$nblus1 ++};
			my $nn1 = 0;
			my $incr1 = 0;
			for my $i (1 .. $nblus1) {
			  $line = <FIC>;
                          chomp($line);
			  my @temp1 = unpack ("A22" x (length($line)/22), $line);
			  for my $j (1 .. (length($line)/22)) {
				$points[$nn1][$incr1] = $temp1[$j - 1] * 1.;
				#print "points[$nn1][$iincr1]=$points[$nn1][$incr1] \n";
			   	if (($incr1 + 1) % ($dime + 1)) {$incr1++}
				else { $incr1=0; $nn1++;};
			  };
			};
			if ($verb1) {print "$nn1 points lus\n";};
#
		}}};
#    PILE des maillages
		if ($pile == 1) {{{
			if ($verb1) {print "  Lecture des MAILLAGEs : ";};
			my $nblus1 = int($nommes1 / 8);
			if ( $nommes1 % 8) {$nblus1 ++};
			#print "$nbsaut1\n";
			my @noms_mail_temp;
			my $nommes2 = 0;
			for my $i (1 .. $nblus1) {
				$line = <FIC>;
				chomp($line);
				my @temp1 = unpack ("A9" x (length($line)/9), $line);
				for my $j (1 .. (length($line)/9)) {
					$noms_mail_temp[$nommes2] = "$temp1[$j - 1]" ;
					$noms_mail_temp[$nommes2] =~ s/ //g;
					$nommes2 ++;
				};
			};
			my $nblus1 = int($nommes1 / 10);
			if ( $nommes1 % 10) {$nblus1 ++};
			$nommes2 = 0;
			for my $i (1 .. $nblus1) {
				$line = <FIC>;
				chomp($line);
				my @temp1 = unpack ("A8" x (length($line)/8), $line);
				for my $j (1 .. (length($line)/8)) {
					$noms_mail{$noms_mail_temp[$nommes2]} = $temp1[$j - 1] + 0;
					#print "$noms_mail_temp[$nommes2],$noms_mail{$noms_mail_temp[$nommes2]}\n"; 
					$nommes2 ++;
				};
			};
			#
			for my $k (1 .. $objets1) {
			  $line = <FIC>;
                          chomp($line);
			  my @temp1 = unpack ("A8" x 5, $line);
			  # Info sur le type d'element
			  $mail_tyel[$k-1] = $temp1[0] + 0;
			  my $nbel_el1 = $temp1[4] + 0;
			  $mail_nbel[$k-1] = $nbel_el1;
			  my $nbnd_el1 = $temp1[3] + 0;
			  $mail_nbno[$k-1] = $nbnd_el1;
			  #print "$k : $nbel_el1 - $nbnd_el1\n";
			  # On saute les sous references
			  if (( $temp1[1] + 0) != 0) {$line = <FIC>};
			  if ($mail_tyel[$k-1] != 0) {
			  	if (( $temp1[2] + 0) != 0) {$line = <FIC>};
			  	my $nbsaut1 = int($nbel_el1 / 10);
			  	if ( $nbel_el1 % 10) {$nbsaut1 ++};
				  # On saute les couleurs
				  for my $i (1 .. $nbsaut1) {$line = <FIC>};
				  my $nblus1 = int(($nbel_el1*$nbnd_el1)/ 10);
				  if (($nbel_el1*$nbnd_el1) % 10) {$nblus1 ++};
				  # On lit les connectivites
				  my $nd1 = 0;
				  my $el1 = 0;
				  for my $i (1 .. $nblus1) {
				    $line = <FIC>;
				    chomp($line);
				    my @temp1 = unpack ("A8" x (length($line)/8), $line);
				    for my $j (1 .. (length($line)/8)) {
					$mail[$k-1][$el1][$nd1] = $temp1[$j - 1] + 0;
					#print "mail[$k,$el1,$nd1]=$mail[$k][$el1][$nd1] \n";
					if (($nd1 + 1) % ($nbnd_el1)) {$nd1++}
					else { $nd1=0; $el1++}
				    };
				  };
				  #print "Maillage $k : $el1 elements\n";
			  }
			  # Cas des maillages avec sous référence
			  else { 
				chomp($line);
				my @temp2 = unpack ("A8" x (length($line)/8), $line);
				for my $j (1 .. (length($line)/8)) {
					$mail[$k-1][1][$j] = $temp2[$j - 1] + 0;
				};
			  	if (( $temp1[2] + 0) != 0) {$line = <FIC>};
			  };
			};
			if ($verb1) {print "$objets1 maillages\n";};
		}}};
	};
		
};
close(FIC);
#
# On lit le fichier des choses à sortir dans abaqus
#
my $fit = "$generic.c2a";
open( FIT, "$fit") || die "\n$fit inexistant\n\n";
if ($verb1) {print "\nLecture de $fit\n";};
my $nb_CARTES = 0;
my @CARTES;
my $nb_NSET = 0;
my @NSET;
my $nb_ELSET = 0;
my @ELSET;
my $nb_SDLOAD = 0;
my @SDLOAD;
my $nb_SURFAC = 0;
my @SURFAC;
$line = "NULL";
while (($line ne "***\n") && ($line = <FIT>)){
	if ($line =~ /\s*NSET\s*(\w*)\s*=\s*(\w*)\s*/i) {
		if ($verb1) {print "NSET-$1-$2\n"; };
		$NSET[$nb_NSET][1] = $1;
		$NSET[$nb_NSET][2] = uc $2;
		$nb_NSET++;
	};
	if ($line =~ /\s*ELSET\s*(\w*)\s*=\s*(\w*)\s*(\w*)\s*/i) {
		if ($verb1) {print "ELSET-$1-$2\n"; };
		$ELSET[$nb_ELSET][1] = $1;
		$ELSET[$nb_ELSET][2] = uc $2;
		$ELSET[$nb_ELSET][3] = $3;
		$nb_ELSET++;
	};
	if ($line =~ /\s*SDLOAD\s*(\w*)\s*(\w*)\s*(\S*)/i) {
		if ($verb1) {print "SDLOAD-$1-$2-$3\n"; };
		$SDLOAD[$nb_SDLOAD][1] = uc $1;
		$SDLOAD[$nb_SDLOAD][2] = uc $2;
		$SDLOAD[$nb_SDLOAD][3] = $3;
		$nb_SDLOAD++;
	};
	if ($line =~ /\s*SURFACE\s*(\w*)\s*=\s*(\w*)\s*(\w*)\s*/i) {
		if ($verb1) {print "SURFACE-$1-$2-$3\n"; };
		$SURFAC[$nb_SURFAC][1] = $2;
		$SURFAC[$nb_SURFAC][2] = uc $3;
		$SURFAC[$nb_SURFAC][3] = uc $1;
		$nb_SURFAC++;
	};
};
if ($line eq "***\n") {
	$line = <FIT>;
	until ($line eq "***\n") {
		$CARTES[$nb_CARTES] = $line;
		$nb_CARTES++;
		$line = <FIT>;
	}
};

close(FIT);
#
# On a lu le fichier, on peut travailler
#
my $fis = "$generic.inp";
open( FIS, ">$fis") || die "\nimpossible de creer $fis\n\n";
#
if ($verb1) {print "\nEcriture de $fis\n";};
print FIS "*HEADING\n";
print FIS "$generic\n";
print FIS "*RESTART,WRITE,FREQUENCY=1\n";
print FIS "**\n";
#
# Ecriture des noeuds
print FIS "*NODE\n";
my $nbtot_noeuds = $#noeuds+1;
for my $i (1 .. $nbtot_noeuds) {{{
	my $poin1 = $noeuds[$i-1];
	print FIS "$i";
	for my $ico1 (1 .. $dime) {
		my $coor1 = $points[$poin1 - 1][$ico1 - 1];
		#print FIS ",$coor1 ";
		printf FIS (",%.5e",$coor1 );
	};
	print FIS "\n";
}}}
# Les NSET
for my $i (0 .. ($nb_NSET-1)) {{{
        #print "$noms_mail{$NSET[$i][2]}-$NSET[$i][2]\n";
	if ($noms_mail{$NSET[$i][2]}) {
		if ($verb1) {print     "*NSET,NSET=$NSET[$i][1]\n";};
		print FIS "*NSET,NSET=$NSET[$i][1]\n";
		my $nmail1 = $noms_mail{$NSET[$i][2]} - 1;
		if ($mail_tyel[$nmail1] == 1) {
			my $nbno1 = $mail_nbel[$nmail1];
			#print "$NSET[$i][2] - $nbno1 noeuds\n";
			for my $j (0 ... ($nbno1 - 1)) {
				print FIS "$mail[$nmail1][$j][0],\n";
			}
		}
		else {
			print "$NSET[$i][2] n'est pas de type POI1\n";
		};
	}
	else {
		print "$NSET[$i][2] inexistant dans le maillage cast3m\n";
	};
}}};
# Les ELSET
for my $i (0 .. ($nb_ELSET-1)) {{{
        #print "$noms_mail{$ELSET[$i][2]}-$ELSET[$i][2]\n";
	if ($noms_mail{$ELSET[$i][2]}) {
		my $nmail1 = $noms_mail{$ELSET[$i][2]} - 1;
		my $ttype1 = $ELSET[$i][3];
		my $typma1 = $mail_tyel[$nmail1];
		if ($typma1 == 0) {
			my $nbref1 = $#{ $mail[$nmail1][1]} ;
			if ($verb1) {print "$ELSET[$i][2] : $nbref1 types d'éléments\n";};
			for my $ref1 (1 .. $nbref1){
				my $nmail2 = $mail[$nmail1][1][$ref1] - 1;
				my $nom2 = "$ELSET[$i][1]$ref1";
				ab_elset($nmail2,$nom2,$ttype1);
			}
			print FIS "*ELSET, ELSET=$ELSET[$i][1]\n";
			for my $ref1 (1 .. $nbref1){
				my $nom2 = "$ELSET[$i][1]$ref1";
				print FIS "$nom2,\n";
			}
		}
		else {
			ab_elset($nmail1,$ELSET[$i][1],$ttype1);
		}
	}
	else {
		print "$ELSET[$i][2] inexistant dans le maillage cast3m\n";
	};
}}}
# Pour compter les elemnts à chercher
my $reste;
#
# Les SURFACE, si il y en a
if ($nb_SURFAC != 0){{{
	for my $i (1 .. $nb_SURFAC){
		ab_surfac($i);
	}
}}}
#
# On ecrit les cartes supplementaires si besoin
if ($nb_CARTES) { for (@CARTES) {print FIS "$_"}};
#
# Les SDLOAD, si il y en a
if ($nb_SDLOAD != 0){{{
	print FIS "**\n";
	print FIS "*STEP\n";
	print FIS "*STATIC\n";
	for my $i (1 .. $nb_SDLOAD){
		ab_sdload($i);
	}
	print FIS "*ENDSTEP\n";
}}};
#
close(FIS);
#
exit;
#
#
#========================================================================================
# Ecriture des elements dans le cas sans bord
#========================================================================================
#
sub ab_elset
{{{	
	my($nmail1, $nom1, $ttype1) = @_;
	my $typma1 = $mail_tyel[$nmail1];
	# Le chapeau
	if ($corresp_typ_el[$typma1][$ifour]) {
                # nom de l'element
		my $nom_elem1;
		if ($ttype1) {
			$nom_elem1 = $ttype1;	
		} else {
			if ($reduit1) {
				$nom_elem1 = "$corresp_typ_el[$typma1][$ifour]R";
			} else {
				$nom_elem1 = "$corresp_typ_el[$typma1][$ifour]";
			}
		};
		if ($verb1) {print "*ELEMENT,TYPE=$nom_elem1,ELSET=$nom1\n";}
		print FIS "*ELEMENT,TYPE=$nom_elem1,ELSET=$nom1\n";
		my $nom_de_code = "ab_" . $typ_el_cast[$typma1]; 
		for my $el1 (0 .. ($mail_nbel[$nmail1] - 1)) {
			&$nom_de_code($nmail1,$el1);
		};
	} else {
		print "$typ_el_cast[$typma1] non supporté\n";
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element SEG2
#========================================================================================
#
sub ab_SEG2 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
        print FIS ",$mail[$nmail1][$el1][0]";
        print FIS ",$mail[$nmail1][$el1][1]";
	print FIS "\n";
	$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	return;
}}};
#
#========================================================================================
# Ecriture d'un element SEG3
#========================================================================================
#
sub ab_SEG3 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
        print FIS ",$mail[$nmail1][$el1][0]";
        print FIS ",$mail[$nmail1][$el1][2]";
        print FIS ",$mail[$nmail1][$el1][1]";
	print FIS "\n";
	$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	return;
}}};
#
#========================================================================================
# Ecriture d'un element TRI3 (cas sans bords)
#========================================================================================
#
sub ab_TRI3 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $x2 = $points[$noeuds[$no2-1] - 1][0];
	my $y2 = $points[$noeuds[$no2-1] - 1][1];
	my $x3 = $points[$noeuds[$no3-1] - 1][0];
	my $y3 = $points[$noeuds[$no3-1] - 1][1];
	my $pv1 = (($x2 - $x1)*($y3 - $y1)) - (($x3 - $x1)*($y2 - $y1));
	#print "$no1 $no2 $no3 - $x1 $y1 $x2 $y2 $x3 $y3 : $pv1\n";
	if ($pv1 > 0.) {
		print FIS ",$no1,$no2,$no3\n";
		$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	} else {
		print FIS ",$no1,$no3,$no2\n";
		$corresp_num_el[$nmail1][$el1] = -1 * $num_el_abaqus;
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element TRI6 (cas sans bords)
#========================================================================================
#
sub ab_TRI6 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $no5 = $mail[$nmail1][$el1][4];
	my $no6 = $mail[$nmail1][$el1][5];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $x2 = $points[$noeuds[$no3-1] - 1][0];
	my $y2 = $points[$noeuds[$no3-1] - 1][1];
	my $x3 = $points[$noeuds[$no5-1] - 1][0];
	my $y3 = $points[$noeuds[$no5-1] - 1][1];
	my $pv1 = (($x2 - $x1)*($y3 - $y1)) - (($x3 - $x1)*($y2 - $y1));
	if ($pv1 > 0.) {
		print FIS ",$no1,$no3,$no5,$no2,$no4,$no6\n";
		$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	} else {
		print FIS ",$no1,$no5,$no3,$no6,$no4,$no2\n";
		$corresp_num_el[$nmail1][$el1] = -1 * $num_el_abaqus;
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element QUA4 (cas sans bords)
#========================================================================================
#
sub ab_QUA4 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $x2 = $points[$noeuds[$no2-1] - 1][0];
	my $y2 = $points[$noeuds[$no2-1] - 1][1];
	my $x3 = $points[$noeuds[$no3-1] - 1][0];
	my $y3 = $points[$noeuds[$no3-1] - 1][1];
	my $pv1 = (($x2 - $x1)*($y3 - $y1)) - (($x3 - $x1)*($y2 - $y1));
	if ($pv1 > 0.) {
		print FIS ",$no1,$no2,$no3,$no4\n";
		$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	} else {
		print FIS ",$no1,$no4,$no3,$no2\n";
		$corresp_num_el[$nmail1][$el1] = -1 * $num_el_abaqus;
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element QUA8 (cas sans bords)
#========================================================================================
#
sub ab_QUA8 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $no5 = $mail[$nmail1][$el1][4];
	my $no6 = $mail[$nmail1][$el1][5];
	my $no7 = $mail[$nmail1][$el1][6];
	my $no8 = $mail[$nmail1][$el1][7];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $x2 = $points[$noeuds[$no3-1] - 1][0];
	my $y2 = $points[$noeuds[$no3-1] - 1][1];
	my $x3 = $points[$noeuds[$no5-1] - 1][0];
	my $y3 = $points[$noeuds[$no5-1] - 1][1];
	my $pv1 = (($x2 - $x1)*($y3 - $y1)) - (($x3 - $x1)*($y2 - $y1));
	if ($pv1 > 0.) {
		print FIS ",$no1,$no3,$no5,$no7,$no2,$no4,$no6,$no8\n";
		$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	} else {
		print FIS ",$no1,$no7,$no5,$no3,$no8,$no6,$no4,$no2\n";
		$corresp_num_el[$nmail1][$el1] = -1 * $num_el_abaqus;
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element CUB8 (cas sans bords)
#========================================================================================
#
sub ab_CUB8 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $no5 = $mail[$nmail1][$el1][4];
	my $no6 = $mail[$nmail1][$el1][5];
	my $no7 = $mail[$nmail1][$el1][6];
	my $no8 = $mail[$nmail1][$el1][7];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x2 = $points[$noeuds[$no2-1] - 1][0];
	my $y2 = $points[$noeuds[$no2-1] - 1][1];
	my $z2 = $points[$noeuds[$no2-1] - 1][2];
	my $x3 = $points[$noeuds[$no3-1] - 1][0];
	my $y3 = $points[$noeuds[$no3-1] - 1][1];
	my $z3 = $points[$noeuds[$no3-1] - 1][2];
	my $x5 = $points[$noeuds[$no5-1] - 1][0];
	my $y5 = $points[$noeuds[$no5-1] - 1][1];
	my $z5 = $points[$noeuds[$no5-1] - 1][2];
	my $vx1 = $x2 - $x1; my $vy1 = $y2 - $y1; my $vz1 = $z2 - $z1;
	my $vx2 = $x3 - $x1; my $vy2 = $y3 - $y1; my $vz2 = $z3 - $z1;
	my $vx3 = $x5 - $x1; my $vy3 = $y5 - $y1; my $vz3 = $z5 - $z1;
	my $pvx1 = ($vy1 * $vz2) - ($vz1 * $vy2);
	my $pvy1 = ($vz1 * $vx2) - ($vx1 * $vz2);
	my $pvz1 = ($vx1 * $vy2) - ($vy1 * $vx2);
	my $pv1 = ($pvx1*$vx3)+($pvy1*$vy3)+($pvz1*$vz3);
	if ($pv1 > 0.) {
		print FIS ",$no1,$no2,$no3,$no4,$no5,$no6,$no7,$no8\n";
		$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	} else {
		print FIS ",$no5,$no6,$no7,$no8,$no1,$no2,$no3,$no4\n";
		$corresp_num_el[$nmail1][$el1] = -1 * $num_el_abaqus;
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element PRI6 (cas sans bords)
#========================================================================================
#
sub ab_PRI6 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $no5 = $mail[$nmail1][$el1][4];
	my $no6 = $mail[$nmail1][$el1][5];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x2 = $points[$noeuds[$no2-1] - 1][0];
	my $y2 = $points[$noeuds[$no2-1] - 1][1];
	my $z2 = $points[$noeuds[$no2-1] - 1][2];
	my $x3 = $points[$noeuds[$no3-1] - 1][0];
	my $y3 = $points[$noeuds[$no3-1] - 1][1];
	my $z3 = $points[$noeuds[$no3-1] - 1][2];
	my $x5 = $points[$noeuds[$no4-1] - 1][0];
	my $y5 = $points[$noeuds[$no4-1] - 1][1];
	my $z5 = $points[$noeuds[$no4-1] - 1][2];
	my $vx1 = $x2 - $x1; my $vy1 = $y2 - $y1; my $vz1 = $z2 - $z1;
	my $vx2 = $x3 - $x1; my $vy2 = $y3 - $y1; my $vz2 = $z3 - $z1;
	my $vx3 = $x5 - $x1; my $vy3 = $y5 - $y1; my $vz3 = $z5 - $z1;
	my $pvx1 = ($vy1 * $vz2) - ($vz1 * $vy2);
	my $pvy1 = ($vz1 * $vx2) - ($vx1 * $vz2);
	my $pvz1 = ($vx1 * $vy2) - ($vy1 * $vx2);
	my $pv1 = ($pvx1*$vx3)+($pvy1*$vy3)+($pvz1*$vz3);
	if ($pv1 > 0.) {
		print FIS ",$no1,$no2,$no3,$no4,$no5,$no6\n";
		$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	} else {
		print FIS ",$no1,$no3,$no2,$no4,$no6,$no5\n";
		$corresp_num_el[$nmail1][$el1] = -1 * $num_el_abaqus;
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element TET4 (cas sans bords)
#========================================================================================
#
sub ab_TET4 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x2 = $points[$noeuds[$no2-1] - 1][0];
	my $y2 = $points[$noeuds[$no2-1] - 1][1];
	my $z2 = $points[$noeuds[$no2-1] - 1][2];
	my $x3 = $points[$noeuds[$no3-1] - 1][0];
	my $y3 = $points[$noeuds[$no3-1] - 1][1];
	my $z3 = $points[$noeuds[$no3-1] - 1][2];
	my $x5 = $points[$noeuds[$no4-1] - 1][0];
	my $y5 = $points[$noeuds[$no4-1] - 1][1];
	my $z5 = $points[$noeuds[$no4-1] - 1][2];
	my $vx1 = $x2 - $x1; my $vy1 = $y2 - $y1; my $vz1 = $z2 - $z1;
	my $vx2 = $x3 - $x1; my $vy2 = $y3 - $y1; my $vz2 = $z3 - $z1;
	my $vx3 = $x5 - $x1; my $vy3 = $y5 - $y1; my $vz3 = $z5 - $z1;
	my $pvx1 = ($vy1 * $vz2) - ($vz1 * $vy2);
	my $pvy1 = ($vz1 * $vx2) - ($vx1 * $vz2);
	my $pvz1 = ($vx1 * $vy2) - ($vy1 * $vx2);
	my $pv1 = ($pvx1*$vx3)+($pvy1*$vy3)+($pvz1*$vz3);
	if ($pv1 > 0.) {
		print FIS ",$no1,$no2,$no3,$no4\n";
		$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	} else {
		print FIS ",$no1,$no3,$no2,$no4\n";
		$corresp_num_el[$nmail1][$el1] = -1 * $num_el_abaqus;
 	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element PYR5 (cas sans bords)
#========================================================================================
#
sub ab_PYR5 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $no4 = $mail[$nmail1][$el1][5];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x2 = $points[$noeuds[$no2-1] - 1][0];
	my $y2 = $points[$noeuds[$no2-1] - 1][1];
	my $z2 = $points[$noeuds[$no2-1] - 1][2];
	my $x3 = $points[$noeuds[$no3-1] - 1][0];
	my $y3 = $points[$noeuds[$no3-1] - 1][1];
	my $z3 = $points[$noeuds[$no3-1] - 1][2];
	my $x5 = $points[$noeuds[$no5-1] - 1][0];
	my $y5 = $points[$noeuds[$no5-1] - 1][1];
	my $z5 = $points[$noeuds[$no5-1] - 1][2];
	my $vx1 = $x2 - $x1; my $vy1 = $y2 - $y1; my $vz1 = $z2 - $z1;
	my $vx2 = $x3 - $x1; my $vy2 = $y3 - $y1; my $vz2 = $z3 - $z1;
	my $vx3 = $x5 - $x1; my $vy3 = $y5 - $y1; my $vz3 = $z5 - $z1;
	my $pvx1 = ($vy1 * $vz2) - ($vz1 * $vy2);
	my $pvy1 = ($vz1 * $vx2) - ($vx1 * $vz2);
	my $pvz1 = ($vx1 * $vy2) - ($vy1 * $vx2);
	my $pv1 = ($pvx1*$vx3)+($pvy1*$vy3)+($pvz1*$vz3);
	if ($pv1 > 0.) {
		print FIS ",$no1,$no2,$no3,$no4,$no5\n";
		$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	} else {
		print FIS ",$no1,$no4,$no3,$no2,$no5\n";
		$corresp_num_el[$nmail1][$el1] = -1 * $num_el_abaqus;
 	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element TE10 (cas sans bords)
#========================================================================================
#
sub ab_TE10 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $no5 = $mail[$nmail1][$el1][4];
	my $no6 = $mail[$nmail1][$el1][5];
	my $no7 = $mail[$nmail1][$el1][6];
	my $no8 = $mail[$nmail1][$el1][7];
	my $no9 = $mail[$nmail1][$el1][8];
	my $no10 = $mail[$nmail1][$el1][9];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x2 = $points[$noeuds[$no3-1] - 1][0];
	my $y2 = $points[$noeuds[$no3-1] - 1][1];
	my $z2 = $points[$noeuds[$no3-1] - 1][2];
	my $x3 = $points[$noeuds[$no5-1] - 1][0];
	my $y3 = $points[$noeuds[$no5-1] - 1][1];
	my $z3 = $points[$noeuds[$no5-1] - 1][2];
	my $x5 = $points[$noeuds[$no10-1] - 1][0];
	my $y5 = $points[$noeuds[$no10-1] - 1][1];
	my $z5 = $points[$noeuds[$no10-1] - 1][2];
	my $vx1 = $x2 - $x1; my $vy1 = $y2 - $y1; my $vz1 = $z2 - $z1;
	my $vx2 = $x3 - $x1; my $vy2 = $y3 - $y1; my $vz2 = $z3 - $z1;
	my $vx3 = $x5 - $x1; my $vy3 = $y5 - $y1; my $vz3 = $z5 - $z1;
	my $pvx1 = ($vy1 * $vz2) - ($vz1 * $vy2);
	my $pvy1 = ($vz1 * $vx2) - ($vx1 * $vz2);
	my $pvz1 = ($vx1 * $vy2) - ($vy1 * $vx2);
	my $pv1 = (($pvx1*$vx3)+($pvy1*$vy3)+($pvz1*$vz3));
	if ($pv1 > 0.) {
		print FIS ",$no1,$no3,$no5,$no10,$no2,$no4,$no6,$no7,$no8,$no9\n";
		$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	} else {
		print FIS ",$no1,$no5,$no3,$no10,$no6,$no4,$no2,$no7,$no9,$no8\n";
		$corresp_num_el[$nmail1][$el1] = -1 * $num_el_abaqus;
 	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element CU20 (cas sans bords)
#========================================================================================
#
sub ab_CU20 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $no5 = $mail[$nmail1][$el1][4];
	my $no6 = $mail[$nmail1][$el1][5];
	my $no7 = $mail[$nmail1][$el1][6];
	my $no8 = $mail[$nmail1][$el1][7];
	my $no9 = $mail[$nmail1][$el1][8];
	my $no10 = $mail[$nmail1][$el1][9];
	my $no11 = $mail[$nmail1][$el1][10];
	my $no12 = $mail[$nmail1][$el1][11];
	my $no13 = $mail[$nmail1][$el1][12];
	my $no14 = $mail[$nmail1][$el1][13];
	my $no15 = $mail[$nmail1][$el1][14];
	my $no16 = $mail[$nmail1][$el1][15];
	my $no17 = $mail[$nmail1][$el1][16];
	my $no18 = $mail[$nmail1][$el1][17];
	my $no19 = $mail[$nmail1][$el1][18];
	my $no20 = $mail[$nmail1][$el1][19];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x2 = $points[$noeuds[$no3-1] - 1][0];
	my $y2 = $points[$noeuds[$no3-1] - 1][1];
	my $z2 = $points[$noeuds[$no3-1] - 1][2];
	my $x3 = $points[$noeuds[$no5-1] - 1][0];
	my $y3 = $points[$noeuds[$no5-1] - 1][1];
	my $z3 = $points[$noeuds[$no5-1] - 1][2];
	my $x5 = $points[$noeuds[$no13-1] - 1][0];
	my $y5 = $points[$noeuds[$no13-1] - 1][1];
	my $z5 = $points[$noeuds[$no13-1] - 1][2];
	my $vx1 = $x2 - $x1; my $vy1 = $y2 - $y1; my $vz1 = $z2 - $z1;
	my $vx2 = $x3 - $x1; my $vy2 = $y3 - $y1; my $vz2 = $z3 - $z1;
	my $vx3 = $x5 - $x1; my $vy3 = $y5 - $y1; my $vz3 = $z5 - $z1;
	my $pvx1 = ($vy1 * $vz2) - ($vz1 * $vy2);
	my $pvy1 = ($vz1 * $vx2) - ($vx1 * $vz2);
	my $pvz1 = ($vx1 * $vy2) - ($vy1 * $vx2);
	my $pv1 = ($pvx1*$vx3)+($pvy1*$vy3)+($pvz1*$vz3);
	if ($pv1 > 0.) {
		print FIS ",$no1,$no3,$no5,$no7,$no13,$no15,$no17,$no19,$no2,$no4";
		print FIS ",$no6,$no8,$no14,$no16,$no18,$no20,$no9,$no10,$no11,$no12\n";
		$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	} else {
		print FIS ",$no1,$no7,$no5,$no3,$no13,$no19,$no17,$no15,$no8,$no6";
		print FIS ",$no4,$no2,$no20,$no18,$no16,$no14,$no9,$no12,$no11,$no10\n";
		$corresp_num_el[$nmail1][$el1] = -1 * $num_el_abaqus;
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element PR15 (cas sans bords)
#========================================================================================
#
sub ab_PR15 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $no5 = $mail[$nmail1][$el1][4];
	my $no6 = $mail[$nmail1][$el1][5];
	my $no7 = $mail[$nmail1][$el1][6];
	my $no8 = $mail[$nmail1][$el1][7];
	my $no9 = $mail[$nmail1][$el1][8];
	my $no10 = $mail[$nmail1][$el1][9];
	my $no11 = $mail[$nmail1][$el1][10];
	my $no12 = $mail[$nmail1][$el1][11];
	my $no13 = $mail[$nmail1][$el1][12];
	my $no14 = $mail[$nmail1][$el1][13];
	my $no15 = $mail[$nmail1][$el1][14];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x2 = $points[$noeuds[$no3-1] - 1][0];
	my $y2 = $points[$noeuds[$no3-1] - 1][1];
	my $z2 = $points[$noeuds[$no3-1] - 1][2];
	my $x3 = $points[$noeuds[$no5-1] - 1][0];
	my $y3 = $points[$noeuds[$no5-1] - 1][1];
	my $z3 = $points[$noeuds[$no5-1] - 1][2];
	my $x5 = $points[$noeuds[$no10-1] - 1][0];
	my $y5 = $points[$noeuds[$no10-1] - 1][1];
	my $z5 = $points[$noeuds[$no10-1] - 1][2];
	my $vx1 = $x2 - $x1; my $vy1 = $y2 - $y1; my $vz1 = $z2 - $z1;
	my $vx2 = $x3 - $x1; my $vy2 = $y3 - $y1; my $vz2 = $z3 - $z1;
	my $vx3 = $x5 - $x1; my $vy3 = $y5 - $y1; my $vz3 = $z5 - $z1;
	my $pvx1 = ($vy1 * $vz2) - ($vz1 * $vy2);
	my $pvy1 = ($vz1 * $vx2) - ($vx1 * $vz2);
	my $pvz1 = ($vx1 * $vy2) - ($vy1 * $vx2);
	my $pv1 = ($pvx1*$vx3)+($pvy1*$vy3)+($pvz1*$vz3);
	if ($pv1 > 0.) {
		print FIS ",$no1,$no3,$no5,$no10,$no12,$no14,$no2,$no4,$no6";
		print FIS ",$no11,$no13,$no15,$no7,$no8,$no9\n";
		$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	} else {
		print FIS ",$no1,$no5,$no3,$no10,$no14,$no12,$no6,$no4,$no2";
		print FIS ",$no15,$no13,$no11,$no7,$no9,$no8\n";
		$corresp_num_el[$nmail1][$el1] = -1 * $num_el_abaqus;
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element PY13 (cas sans bords)
#========================================================================================
#
sub ab_PY13 
{{{
	my($nmail1, $el1) = @_;
	$num_el_abaqus ++;
	print FIS "$num_el_abaqus";
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $no5 = $mail[$nmail1][$el1][4];
	my $no6 = $mail[$nmail1][$el1][5];
	my $no7 = $mail[$nmail1][$el1][6];
	my $no8 = $mail[$nmail1][$el1][7];
	my $no9 = $mail[$nmail1][$el1][8];
	my $no10 = $mail[$nmail1][$el1][9];
	my $no11 = $mail[$nmail1][$el1][10];
	my $no12 = $mail[$nmail1][$el1][11];
	my $no13 = $mail[$nmail1][$el1][12];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x2 = $points[$noeuds[$no3-1] - 1][0];
	my $y2 = $points[$noeuds[$no3-1] - 1][1];
	my $z2 = $points[$noeuds[$no3-1] - 1][2];
	my $x3 = $points[$noeuds[$no5-1] - 1][0];
	my $y3 = $points[$noeuds[$no5-1] - 1][1];
	my $z3 = $points[$noeuds[$no5-1] - 1][2];
	my $x5 = $points[$noeuds[$no13-1] - 1][0];
	my $y5 = $points[$noeuds[$no13-1] - 1][1];
	my $z5 = $points[$noeuds[$no13-1] - 1][2];
	my $vx1 = $x2 - $x1; my $vy1 = $y2 - $y1; my $vz1 = $z2 - $z1;
	my $vx2 = $x3 - $x1; my $vy2 = $y3 - $y1; my $vz2 = $z3 - $z1;
	my $vx3 = $x5 - $x1; my $vy3 = $y5 - $y1; my $vz3 = $z5 - $z1;
	my $pvx1 = ($vy1 * $vz2) - ($vz1 * $vy2);
	my $pvy1 = ($vz1 * $vx2) - ($vx1 * $vz2);
	my $pvz1 = ($vx1 * $vy2) - ($vy1 * $vx2);
	my $pv1 = ($pvx1*$vx3)+($pvy1*$vy3)+($pvz1*$vz3);
	if ($pv1 > 0.) {
		print FIS ",$no1,$no3,$no5,$no7,$no13,$no2,$no4,$no6,$no8,$no9,$no10,$no11,$no12\n";
		$corresp_num_el[$nmail1][$el1] = $num_el_abaqus;
	} else {
		print FIS ",$no1,$no7,$no5,$no3,$no13,$no8,$no6,$no4,$no2,$no9,$no12,$no11,$no10\n";
		$corresp_num_el[$nmail1][$el1] = -1 * $num_el_abaqus;
	};
	return;
}}};

#
#========================================================================================
# Ecriture des SURFACE
#========================================================================================
#
sub ab_surfac
{{{
	my($num1) = @_;
	my $nom1 = $SURFAC[$num1-1][1];
	my $nom2 = $SURFAC[$num1-1][2];
	my $nom3 = $SURFAC[$num1-1][3];
	my $val1 = 'SURF';
	my $nmail1 = $noms_mail{$nom1}-1;
	my $nmail2 = $noms_mail{$nom2}-1;
	my $typma1 = $mail_tyel[$nmail1];
	# On cherhe le nombre d'elemnt de bord à trouver
	ab_nombre($nmail2);
	if ($verb1) {print "*SURFACE DEFINITION, NAME=$nom3\n";};
	print FIS "*SURFACE DEFINITION, NAME=$nom3\n";
	if ($typma1 == 0) {
		my $nbref1 = $#{ $mail[$nmail1][1]} ;
		#print "$ELSET[$i][2] : $nbref1 types d'éléments\n";
		for my $ref1 (1 .. $nbref1){
			my $nmail3 = $mail[$nmail1][1][$ref1] - 1;
			ab_sdload2($nmail3, $nmail2,$val1);
		}
	} else {
		ab_sdload2($nmail1, $nmail2,$val1);
	}
	return;
}}} ;
#
#========================================================================================
# Recherche du nombre déléments bords.
#========================================================================================
#
sub ab_nombre
{{{
	my ($nmail1) = @_;
	my $typma1 = $mail_tyel[$nmail1];
	$reste = 0;
	if ($typma1 == 0) {
		my $nbref1 = $#{ $mail[$nmail1][1]} ;
		for my $ref1 (1 .. $nbref1){
			my $nmail3 = $mail[$nmail1][1][$ref1] - 1;
			$reste += $mail_nbel[$nmail3];
		}
	} else {
		$reste = $mail_nbel[$nmail1];
	}
}}};
#
#========================================================================================
# Ecriture des SDLOAD
#========================================================================================
#
sub ab_sdload	
{{{
	my($num1) = @_;
	my $nom1 = $SDLOAD[$num1-1][1];
	my $nom2 = $SDLOAD[$num1-1][2];
	my $val1 = $SDLOAD[$num1-1][3];
	my $nmail1 = $noms_mail{$nom1}-1;
	my $nmail2 = $noms_mail{$nom2}-1;
	my $typma1 = $mail_tyel[$nmail1];
	# On cherhe le nombre d'elemnt de bord à trouver
	ab_nombre($nmail2);
	#print "$num1 $nom1 $nmail1 $nom2 $nmail2\n";
	if ($verb1) {print     "*DLOAD (pression $val1 sur $nom2)\n";};
	print FIS "*DLOAD\n";
	if ($typma1 == 0) {
		my $nbref1 = $#{ $mail[$nmail1][1]} ;
		#print "$ELSET[$i][2] : $nbref1 types d'éléments\n";
		for my $ref1 (1 .. $nbref1){
			my $nmail3 = $mail[$nmail1][1][$ref1] - 1;
			ab_sdload2($nmail3, $nmail2,$val1);
		}
	} else {
		ab_sdload2($nmail1, $nmail2,$val1);
	}
	return;
}}} ;
#
#========================================================================================
# Ecriture d'un SDLOAD
#========================================================================================
#
sub ab_sdload2
{{{	
	my($nmail1,$nmail2,$val1) = @_;
	my $typma1 = $mail_tyel[$nmail1];
	my $nom_de_code = "ac_" . $typ_el_cast[$typma1]; 
	for my $el1 (0 .. ($mail_nbel[$nmail1] - 1)) {
		&$nom_de_code($nmail1,$el1,$nmail2,$val1);
		if ($reste == 0) {last};
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element TRI3 (cas avec bords)
#========================================================================================
#
sub inlist{my $b=pop;for(@_){ if ($_==$b){return 1;}};return 0};
#sub inlist{my $b=pop;my $z = 0;for(@_){ if ($_==$b){$z=1;last;}};return $z};
#
#========================================================================================
# Ecriture d'un element TRI3 (cas avec bords)
#========================================================================================
#
sub ac_TRI3 
{{{
	my($nmail1, $el1, $nmail2, $val1) = @_;
	# type d'element sur le bord
	my $typma0 = 2;
	my @tab0;
	$tab0[1] = 3;
	$tab0[2] = 2;
	$tab0[3] = 1;
	#
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x3 = $points[$noeuds[$no3-1] - 1][0];
	my $y3 = $points[$noeuds[$no3-1] - 1][1];
	my $z3 = $points[$noeuds[$no3-1] - 1][2];
	$dimelt1 = (($x1 - $x3)**2 + ($y1 - $y3)**2 + ($z1 - $z3)**2)**0.5;
	my $no200 = $no2;
	if ($corresp_num_el[$nmail1][$el1]<0.) {$no200 = $no3};
        #
	# On regarde dans le bord
	my $nmail3 = -1;
	my $typma2 = $mail_tyel[$nmail2];
	if ($typma2 == 0) {
		my $nbref2 = $#{ $mail[$nmail2][1]} ;
		for my $ref2 (1 .. $nbref2){
			my $nmail4 = $mail[$nmail2][1][$ref2] - 1;
			my $typma4 = $mail_tyel[$nmail4];
			if ($typma0 == $typma4) {$nmail3 = $nmail4};
		}
	} else {
		if ($typma0 == $typma2) {$nmail3 = $nmail2};
	}
	if ($nmail3 == -1) { die "Probleme de correspondance face-maillage "};
        #my @tab1 = ($no1,$no2,$no3);
        my @tab1 = @{$mail[$nmail1][$el1]};
	#print "@tab1\n";
	#
	# On boucle sur les element du bord
	for my $el2 (0 .. ($mail_nbel[$nmail3] - 1)) {
		my $no10 = $mail[$nmail3][$el2][0];
		my $x2 = $points[$noeuds[$no10-1] - 1][0];
		my $y2 = $points[$noeuds[$no10-1] - 1][1];
		my $z2 = $points[$noeuds[$no10-1] - 1][2];
		my $dist1 = (($x1 - $x2)**2 + ($y1 - $y2)**2 + ($z1 - $z2)**2)**0.5;
		if ($dist1 < ($coef1 * $dimelt1)) {
			my $no20 = $mail[$nmail3][$el2][1];
			if ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20))){
				my $si1 = 0;
				#my @tab2 = ($no10,$no20);
				my @tab2 = @{$mail[$nmail3][$el2]};
				if (inlist(@tab2,$no1)){$si1++};
				if (inlist(@tab2,$no200)){$si1+=2};
				my $nnum1 = abs $corresp_num_el[$nmail1][$el1];
				if ($val1 eq 'SURF') {
					print FIS "$nnum1,S$tab0[$si1]\n";
				} else {
					print FIS "$nnum1,P$tab0[$si1],$val1\n";
				}
				$reste --;
			};
		};
		
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element QUA4 (cas avec bords)
#========================================================================================
#
sub ac_QUA4 
{{{
	my($nmail1, $el1, $nmail2, $val1) = @_;
	# type d'element sur le bord
	my $typma0 = 2;
	my @tab0;
	$tab0[1] = 4;
	$tab0[2] = 2;
	$tab0[3] = 1;
	$tab0[0] = 3;
	#
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x3 = $points[$noeuds[$no3-1] - 1][0];
	my $y3 = $points[$noeuds[$no3-1] - 1][1];
	my $z3 = $points[$noeuds[$no3-1] - 1][2];
	$dimelt1 = (($x1 - $x3)**2 + ($y1 - $y3)**2 + ($z1 - $z3)**2)**0.5;
	my $no200 = $no2;
	if ($corresp_num_el[$nmail1][$el1]<0.) {$no200 = $no3};
        #
	# On regarde dans le bord
	my $nmail3 = -1;
	my $typma2 = $mail_tyel[$nmail2];
	if ($typma2 == 0) {
		my $nbref2 = $#{ $mail[$nmail2][1]} ;
		for my $ref2 (1 .. $nbref2){
			my $nmail4 = $mail[$nmail2][1][$ref2] - 1;
			my $typma4 = $mail_tyel[$nmail4];
			if ($typma0 == $typma4) {$nmail3 = $nmail4};
		}
	} else {
		if ($typma0 == $typma2) {$nmail3 = $nmail2};
	}
	if ($nmail3 == -1) { die "Probleme de correspondance face-maillage "};
        #my @tab1 = ($no1,$no2,$no3);
        my @tab1 = @{$mail[$nmail1][$el1]};
	#print "@tab1\n";
	#
	# On boucle sur les element du bord
	for my $el2 (0 .. ($mail_nbel[$nmail3] - 1)) {
		my $no10 = $mail[$nmail3][$el2][0];
		my $x2 = $points[$noeuds[$no10-1] - 1][0];
		my $y2 = $points[$noeuds[$no10-1] - 1][1];
		my $z2 = $points[$noeuds[$no10-1] - 1][2];
		my $dist1 = (($x1 - $x2)**2 + ($y1 - $y2)**2 + ($z1 - $z2)**2)**0.5;
		if ($dist1 < ($coef1 * $dimelt1)) {
			my $no20 = $mail[$nmail3][$el2][1];
			if ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20))){
				my $si1 = 0;
				#my @tab2 = ($no10,$no20);
				my @tab2 = @{$mail[$nmail3][$el2]};
				if (inlist(@tab2,$no1)){$si1++};
				if (inlist(@tab2,$no200)){$si1+=2};
				my $nnum1 = abs $corresp_num_el[$nmail1][$el1];
				if ($val1 eq 'SURF') {
					print FIS "$nnum1,S$tab0[$si1]\n";
				} else {
					print FIS "$nnum1,P$tab0[$si1],$val1\n";
				}
				$reste --;
			};
		};
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element TRI6 (cas avec bords)
#========================================================================================
#
sub ac_TRI6 
{{{
	my($nmail1, $el1, $nmail2, $val1) = @_;
	# type d'element sur le bord
	my $typma0 = 3;
	my @tab0;
	$tab0[1] = 3;
	$tab0[2] = 2;
	$tab0[3] = 1;
	#
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][2];
	my $no3 = $mail[$nmail1][$el1][4];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x3 = $points[$noeuds[$no2-1] - 1][0];
	my $y3 = $points[$noeuds[$no2-1] - 1][1];
	my $z3 = $points[$noeuds[$no2-1] - 1][2];
	$dimelt1 = (($x1 - $x3)**2 + ($y1 - $y3)**2 + ($z1 - $z3)**2)**0.5;
	my $no200 = $no2;
	if ($corresp_num_el[$nmail1][$el1]<0.) {$no200 = $no3};
        #
	# On regarde dans le bord
	my $nmail3 = -1;
	my $typma2 = $mail_tyel[$nmail2];
	if ($typma2 == 0) {
		my $nbref2 = $#{ $mail[$nmail2][1]} ;
		for my $ref2 (1 .. $nbref2){
			my $nmail4 = $mail[$nmail2][1][$ref2] - 1;
			my $typma4 = $mail_tyel[$nmail4];
			if ($typma0 == $typma4) {$nmail3 = $nmail4};
		}
	} else {
		if ($typma0 == $typma2) {$nmail3 = $nmail2};
	}
	if ($nmail3 == -1) { die "Probleme de correspondance face-maillage "};
        #my @tab1 = ($no1,$no2,$no3);
        my @tab1 = @{$mail[$nmail1][$el1]};
	#print "@tab1\n";
	#
	# On boucle sur les element du bord
	for my $el2 (0 .. ($mail_nbel[$nmail3] - 1)) {
		my $no10 = $mail[$nmail3][$el2][0];
		my $x2 = $points[$noeuds[$no10-1] - 1][0];
		my $y2 = $points[$noeuds[$no10-1] - 1][1];
		my $z2 = $points[$noeuds[$no10-1] - 1][2];
		my $dist1 = (($x1 - $x2)**2 + ($y1 - $y2)**2 + ($z1 - $z2)**2)**0.5;
		if ($dist1 < ($coef1 * $dimelt1)) {
			my $no20 = $mail[$nmail3][$el2][2];
			if ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20))){
				my $si1 = 0;
				#my @tab2 = ($no10,$no20);
				my @tab2 = @{$mail[$nmail3][$el2]};
				if (inlist(@tab2,$no1)){$si1++};
				if (inlist(@tab2,$no200)){$si1+=2};
				my $nnum1 = abs $corresp_num_el[$nmail1][$el1];
				if ($val1 eq 'SURF') {
					print FIS "$nnum1,S$tab0[$si1]\n";
				} else {
					print FIS "$nnum1,P$tab0[$si1],$val1\n";
				}
				$reste --;
			};
		};
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element QUA8 (cas avec bords)
#========================================================================================
#
sub ac_QUA8 
{{{
	my($nmail1, $el1, $nmail2, $val1) = @_;
	# type d'element sur le bord
	my $typma0 = 3;
	my @tab0;
	$tab0[1] = 4;
	$tab0[2] = 2;
	$tab0[3] = 1;
	$tab0[0] = 3;
	#
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][2];
	my $no3 = $mail[$nmail1][$el1][4];
	my $no4 = $mail[$nmail1][$el1][6];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x3 = $points[$noeuds[$no3-1] - 1][0];
	my $y3 = $points[$noeuds[$no3-1] - 1][1];
	my $z3 = $points[$noeuds[$no3-1] - 1][2];
	$dimelt1 = (($x1 - $x3)**2 + ($y1 - $y3)**2 + ($z1 - $z3)**2)**0.5;
	my $no200 = $no2;
	if ($corresp_num_el[$nmail1][$el1]<0.) {$no200 = $no4};
        #
	# On regarde dans le bord
	my $nmail3 = -1;
	my $typma2 = $mail_tyel[$nmail2];
	if ($typma2 == 0) {
		my $nbref2 = $#{ $mail[$nmail2][1]} ;
		for my $ref2 (1 .. $nbref2){
			my $nmail4 = $mail[$nmail2][1][$ref2] - 1;
			my $typma4 = $mail_tyel[$nmail4];
			if ($typma0 == $typma4) {$nmail3 = $nmail4};
		}
	} else {
		if ($typma0 == $typma2) {$nmail3 = $nmail2};
	}
	if ($nmail3 == -1) { die "Probleme de correspondance face-maillage "};
        #my @tab1 = ($no1,$no2,$no3);
        my @tab1 = @{$mail[$nmail1][$el1]};
	#print "@tab1\n";
	#
	# On boucle sur les element du bord
	for my $el2 (0 .. ($mail_nbel[$nmail3] - 1)) {
		my $no10 = $mail[$nmail3][$el2][0];
		my $x2 = $points[$noeuds[$no10-1] - 1][0];
		my $y2 = $points[$noeuds[$no10-1] - 1][1];
		my $z2 = $points[$noeuds[$no10-1] - 1][2];
		my $dist1 = (($x1 - $x2)**2 + ($y1 - $y2)**2 + ($z1 - $z2)**2)**0.5;
		if ($dist1 < ($coef1 * $dimelt1)) {
			my $no20 = $mail[$nmail3][$el2][2];
			if ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20))){
				my $v1 = (inlist(@tab1,$no10));
				#print "$v1 @tab1 $no10 $no20\n";
				my $si1 = 0;
				#my @tab2 = ($no10,$no20);
				my @tab2 = @{$mail[$nmail3][$el2]};
				if (inlist(@tab2,$no1)){$si1++};
				if (inlist(@tab2,$no200)){$si1+=2};
				my $nnum1 = abs $corresp_num_el[$nmail1][$el1];
				if ($val1 eq 'SURF') {
					print FIS "$nnum1,S$tab0[$si1]\n";
				} else {
					print FIS "$nnum1,P$tab0[$si1],$val1\n";
				}
				$reste --;
			};
		};	
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element CUB8 (cas avec bords)
#========================================================================================
#
sub ac_CUB8 
{{{
	my($nmail1, $el1, $nmail2, $val1) = @_;
	# type d'element sur le bord
	my $typma0 = 8;
	my @tab0;
	$tab0[0] = 2;
	$tab0[1] = 6;
	$tab0[3] = 3;
	$tab0[4] = 5;
	$tab0[6] = 4;
	$tab0[7] = 1;
	#
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $no5 = $mail[$nmail1][$el1][4];
	my $no6 = $mail[$nmail1][$el1][5];
	my $no7 = $mail[$nmail1][$el1][6];
	my $no8 = $mail[$nmail1][$el1][7];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x3 = $points[$noeuds[$no7-1] - 1][0];
	my $y3 = $points[$noeuds[$no7-1] - 1][1];
	my $z3 = $points[$noeuds[$no7-1] - 1][2];
	$dimelt1 = (($x1 - $x3)**2 + ($y1 - $y3)**2 + ($z1 - $z3)**2)**0.5;
	#
	my $no100 = $no1; my $no200 = $no2; my $no300 = $no3;
	if ($corresp_num_el[$nmail1][$el1]<0.) {$no100 = $no5; $no200 = $no6; $no300 = $no7;};
        #
	# On regarde dans le bord
	my $nmail3 = -1;
	my $typma2 = $mail_tyel[$nmail2];
	if ($typma2 == 0) {
		my $nbref2 = $#{ $mail[$nmail2][1]} ;
		for my $ref2 (1 .. $nbref2){
			my $nmail4 = $mail[$nmail2][1][$ref2] - 1;
			my $typma4 = $mail_tyel[$nmail4];
			if ($typma0 == $typma4) {$nmail3 = $nmail4};
		}
	} else {
		if ($typma0 == $typma2) {$nmail3 = $nmail2};
	}
	if ($nmail3 == -1) { die "Probleme de correspondance face-maillage "};
        #my @tab1 = ($no1,$no2,$no3);
        my @tab1 = @{$mail[$nmail1][$el1]};
	#print "@tab1\n";
	#
	# On boucle sur les element du bord
	for my $el2 (0 .. ($mail_nbel[$nmail3] - 1)) {
		my $no10 = $mail[$nmail3][$el2][0];
		my $x2 = $points[$noeuds[$no10-1] - 1][0];
		my $y2 = $points[$noeuds[$no10-1] - 1][1];
		my $z2 = $points[$noeuds[$no10-1] - 1][2];
		my $dist1 = (($x1 - $x2)**2 + ($y1 - $y2)**2 + ($z1 - $z2)**2)**0.5;
		if ($dist1 < ($coef1 * $dimelt1)) {
			my $no20 = $mail[$nmail3][$el2][1];
			my $no30 = $mail[$nmail3][$el2][2];
			my $no40 = $mail[$nmail3][$el2][3];
			if ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20)) & (inlist(@tab1,$no30)) & (inlist(@tab1,$no40))){
				my $si1 = 0;
				#my @tab2 = ($no10,$no20);
				my @tab2 = @{$mail[$nmail3][$el2]};
				if (inlist(@tab2,$no100)){$si1++};
				if (inlist(@tab2,$no200)){$si1+=2};
				if (inlist(@tab2,$no300)){$si1+=4};
				my $nnum1 = abs $corresp_num_el[$nmail1][$el1];
				if ($val1 eq 'SURF') {
					print FIS "$nnum1,S$tab0[$si1]\n";
				} else {
					print FIS "$nnum1,P$tab0[$si1],$val1\n";
				}
				$reste --;
			};
		
		};	
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element TET4 (cas avec bords)
#========================================================================================
#
sub ac_TET4 
{{{
	my($nmail1, $el1, $nmail2, $val1) = @_;
	# type d'element sur le bord
	my $typma0 = 4;
	my @tab0;
	$tab0[3] = 2;
	$tab0[5] = 4;
	$tab0[6] = 3;
	$tab0[7] = 1;
	#
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x3 = $points[$noeuds[$no4-1] - 1][0];
	my $y3 = $points[$noeuds[$no4-1] - 1][1];
	my $z3 = $points[$noeuds[$no4-1] - 1][2];
	$dimelt1 = (($x1 - $x3)**2 + ($y1 - $y3)**2 + ($z1 - $z3)**2)**0.5;
	#
	my $no100 = $no1; my $no200 = $no2; my $no300 = $no3;
#	if ($pv1<0.) {$no100 = $no1; $no200 = $no3; $no300 = $no2;};
	if ($corresp_num_el[$nmail1][$el1]<0.) {$no100 = $no1; $no200 = $no3; $no300 = $no2;};
        #
	# On regarde dans le bord
	my $nmail3 = -1;
	my $typma2 = $mail_tyel[$nmail2];
	if ($typma2 == 0) {
		my $nbref2 = $#{ $mail[$nmail2][1]} ;
		for my $ref2 (1 .. $nbref2){
			my $nmail4 = $mail[$nmail2][1][$ref2] - 1;
			my $typma4 = $mail_tyel[$nmail4];
			if ($typma0 == $typma4) {$nmail3 = $nmail4};
		}
	} else {
		if ($typma0 == $typma2) {$nmail3 = $nmail2};
	}
	if ($nmail3 == -1) { die "Probleme de correspondance face-maillage "};
        #my @tab1 = ($no1,$no2,$no3);
        my @tab1 = @{$mail[$nmail1][$el1]};
	#print "@tab1\n";
	#
	# On boucle sur les element du bord
	for my $el2 (0 .. ($mail_nbel[$nmail3] - 1)) {
		my $no10 = $mail[$nmail3][$el2][0];
		my $x2 = $points[$noeuds[$no10-1] - 1][0];
		my $y2 = $points[$noeuds[$no10-1] - 1][1];
		my $z2 = $points[$noeuds[$no10-1] - 1][2];
		my $dist1 = (($x1 - $x2)**2 + ($y1 - $y2)**2 + ($z1 - $z2)**2)**0.5;
		if ($dist1 < ($coef1 * $dimelt1)) {
			my $no20 = $mail[$nmail3][$el2][1];
			my $no30 = $mail[$nmail3][$el2][2];
			if ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20)) & (inlist(@tab1,$no30))){
				my $si1 = 0;
				my @tab2 = @{$mail[$nmail3][$el2]};
				if (inlist(@tab2,$no100)){$si1++};
				if (inlist(@tab2,$no200)){$si1+=2};
				if (inlist(@tab2,$no300)){$si1+=4};
				my $nnum1 = abs $corresp_num_el[$nmail1][$el1];
				if ($val1 eq 'SURF') {
					print FIS "$nnum1,S$tab0[$si1]\n";
				} else {
					print FIS "$nnum1,P$tab0[$si1],$val1\n";
				}
				$reste --;
			};
		};	
		
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element PRI6 (cas avec bords)
#========================================================================================
#
sub ac_PRI6 
{{{
	my($nmail1, $el1, $nmail2, $val1) = @_;
	# type d'element sur le bord
	my $typma01 = 4;
	my $typma02 = 8;
	my @tab0;
	$tab0[0] = 2;
	$tab0[3] = 3;
	$tab0[5] = 5;
	$tab0[6] = 4;
	$tab0[7] = 1;
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $no5 = $mail[$nmail1][$el1][4];
	my $no6 = $mail[$nmail1][$el1][5];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x3 = $points[$noeuds[$no6-1] - 1][0];
	my $y3 = $points[$noeuds[$no6-1] - 1][1];
	my $z3 = $points[$noeuds[$no6-1] - 1][2];
	$dimelt1 = (($x1 - $x3)**2 + ($y1 - $y3)**2 + ($z1 - $z3)**2)**0.5;
	#
	my $no100 = $no1; my $no200 = $no2; my $no300 = $no3;
	if ($corresp_num_el[$nmail1][$el1]<0.) {$no100 = $no1; $no200 = $no3; $no300 = $no2;};
        #
	# On regarde dans le bord
	my @nmail3;
	$nmail3[0] = -1;
	$nmail3[1] = -1;
	my $nb_mail3 = -1;
	my $typma2 = $mail_tyel[$nmail2];
        my @tab1 = @{$mail[$nmail1][$el1]};
	#
	if ($typma2 == 0) {
		my $nbref2 = $#{ $mail[$nmail2][1]} ;
		for my $ref2 (1 .. $nbref2){
			my $nmail4 = $mail[$nmail2][1][$ref2] - 1;
			my $typma4 = $mail_tyel[$nmail4];
			if (($typma01 == $typma4) || ($typma02 == $typma4)) {
				$nb_mail3++;
				$nmail3[$nb_mail3] = $nmail4;
			};
		}
	} else {
		if (($typma01 == $typma2) || ($typma02 == $typma2)) {
			$nb_mail3++;
			$nmail3[$nb_mail3] = $nmail2;
		};
	}
	if ($nb_mail3 == -1) { 
		die "Probleme de correspondance face-maillage ";
	} else {
		for my $kk (0 .. $nb_mail3) {
			#my @tab1 = ($no1,$no2,$no3);
			#print "@tab1\n";
			#
			# On boucle sur les element du bord
			$nmail33 = $nmail3[$kk];
			for my $el2 (0 .. ($mail_nbel[$nmail33] - 1)) {
				my $no10 = $mail[$nmail33][$el2][0];
				my $x2 = $points[$noeuds[$no10-1] - 1][0];
				my $y2 = $points[$noeuds[$no10-1] - 1][1];
				my $z2 = $points[$noeuds[$no10-1] - 1][2];
				my $dist1 = (($x1 - $x2)**2 + ($y1 - $y2)**2 + ($z1 - $z2)**2)**0.5;
				if ($dist1 < ($coef1 * $dimelt1)) {
					my $no20 = $mail[$nmail33][$el2][1];
					my $no30 = $mail[$nmail33][$el2][2];
					my $no40 = $mail[$nmail33][$el2][3];
					my $ttest1;
					if ($mail_tyel[$nmail33] == $typma01) {
						$ttest1 = ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20)) & (inlist(@tab1,$no30)));
					} else {
						$ttest1 = ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20)) & (inlist(@tab1,$no30)) & (inlist(@tab1,$no40)));
					};
					if ($ttest1){
						my $si1 = 0;
						#my @tab2 = ($no10,$no20);
						my @tab2 = @{$mail[$nmail33][$el2]};
						if (inlist(@tab2,$no100)){$si1++};
						if (inlist(@tab2,$no200)){$si1+=2};
						if (inlist(@tab2,$no300)){$si1+=4};
						my $nnum1 = abs $corresp_num_el[$nmail1][$el1];
						if ($val1 eq 'SURF') {
							print FIS "$nnum1,S$tab0[$si1]\n";
						} else {
							print FIS "$nnum1,P$tab0[$si1],$val1\n";
						}
						$reste --;
					};
				};	
				
			};
		};
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element PYR5 (cas avec bords)
#========================================================================================
#
sub ac_PYR5 
{{{
	my($nmail1, $el1, $nmail2, $val1) = @_;
	# type d'element sur le bord
	my $typma01 = 4;
	my $typma02 = 8;
	my @tab0;
	$tab0[1] = 5;
	$tab0[3] = 2;
	$tab0[4] = 4;
	$tab0[6] = 3;
	$tab0[7] = 1;
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][1];
	my $no3 = $mail[$nmail1][$el1][2];
	my $no4 = $mail[$nmail1][$el1][3];
	my $no5 = $mail[$nmail1][$el1][4];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x3 = $points[$noeuds[$no5-1] - 1][0];
	my $y3 = $points[$noeuds[$no5-1] - 1][1];
	my $z3 = $points[$noeuds[$no5-1] - 1][2];
	$dimelt1 = (($x1 - $x3)**2 + ($y1 - $y3)**2 + ($z1 - $z3)**2)**0.5;
	#
	my $no100 = $no1; my $no200 = $no2; my $no300 = $no3;
	if ($corresp_num_el[$nmail1][$el1]<0.) {$no100 = $no1; $no200 = $no3; $no300 = $no2;};
        #
	# On regarde dans le bord
	my @nmail3;
	$nmail3[0] = -1;
	$nmail3[1] = -1;
	my $nb_mail3 = -1;
	my $typma2 = $mail_tyel[$nmail2];
        my @tab1 = @{$mail[$nmail1][$el1]};
	#
	if ($typma2 == 0) {
		my $nbref2 = $#{ $mail[$nmail2][1]} ;
		for my $ref2 (1 .. $nbref2){
			my $nmail4 = $mail[$nmail2][1][$ref2] - 1;
			my $typma4 = $mail_tyel[$nmail4];
			if (($typma01 == $typma4) || ($typma02 == $typma4)) {
				$nb_mail3++;
				$nmail3[$nb_mail3] = $nmail4;
			};
		}
	} else {
		if (($typma01 == $typma2) || ($typma02 == $typma2)) {
			$nb_mail3++;
			$nmail3[$nb_mail3] = $nmail2;
		};
	}
	if ($nb_mail3 == -1) { 
		die "Probleme de correspondance face-maillage ";
	} else {
		for my $kk (0 .. $nb_mail3) {
			#my @tab1 = ($no1,$no2,$no3);
			#print "@tab1\n";
			#
			# On boucle sur les element du bord
			$nmail33 = $nmail3[$kk];
			for my $el2 (0 .. ($mail_nbel[$nmail33] - 1)) {
				my $no10 = $mail[$nmail33][$el2][0];
				my $x2 = $points[$noeuds[$no10-1] - 1][0];
				my $y2 = $points[$noeuds[$no10-1] - 1][1];
				my $z2 = $points[$noeuds[$no10-1] - 1][2];
				my $dist1 = (($x1 - $x2)**2 + ($y1 - $y2)**2 + ($z1 - $z2)**2)**0.5;
				if ($dist1 < ($coef1 * $dimelt1)) {
					my $no20 = $mail[$nmail33][$el2][1];
					my $no30 = $mail[$nmail33][$el2][2];
					my $no40 = $mail[$nmail33][$el2][3];
					my $ttest1;
					if ($mail_tyel[$nmail33] == $typma01) {
						$ttest1 = ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20)) & (inlist(@tab1,$no30)));
					} else {
						$ttest1 = ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20)) & (inlist(@tab1,$no30)) & (inlist(@tab1,$no40)));
					};
					if ($ttest1){
						my $si1 = 0;
						#my @tab2 = ($no10,$no20);
						my @tab2 = @{$mail[$nmail33][$el2]};
						if (inlist(@tab2,$no100)){$si1++};
						if (inlist(@tab2,$no200)){$si1+=2};
						if (inlist(@tab2,$no300)){$si1+=4};
						my $nnum1 = abs $corresp_num_el[$nmail1][$el1];
						if ($val1 eq 'SURF') {
							print FIS "$nnum1,S$tab0[$si1]\n";
						} else {
							print FIS "$nnum1,P$tab0[$si1],$val1\n";
						}
						$reste --;
					};
				};	
				
			};
		};
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element TE10 (cas avec bords)
#========================================================================================
#
sub ac_TE10 
{{{
	my($nmail1, $el1, $nmail2, $val1) = @_;
	# type d'element sur le bord
	my $typma0 = 6;
	my @tab0;
	$tab0[3] = 2;
	$tab0[5] = 4;
	$tab0[6] = 3;
	$tab0[7] = 1;
	#
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][2];
	my $no3 = $mail[$nmail1][$el1][4];
	my $no4 = $mail[$nmail1][$el1][9];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x3 = $points[$noeuds[$no4-1] - 1][0];
	my $y3 = $points[$noeuds[$no4-1] - 1][1];
	my $z3 = $points[$noeuds[$no4-1] - 1][2];
	$dimelt1 = (($x1 - $x3)**2 + ($y1 - $y3)**2 + ($z1 - $z3)**2)**0.5;
	#
	my $no100 = $no1; my $no200 = $no2; my $no300 = $no3;
	if ($corresp_num_el[$nmail1][$el1]<0.) {$no100 = $no1; $no200 = $no3; $no300 = $no2;};
        #
	# On regarde dans le bord
	my $nmail3 = -1;
	my $typma2 = $mail_tyel[$nmail2];
	if ($typma2 == 0) {
		my $nbref2 = $#{ $mail[$nmail2][1]} ;
		for my $ref2 (1 .. $nbref2){
			my $nmail4 = $mail[$nmail2][1][$ref2] - 1;
			my $typma4 = $mail_tyel[$nmail4];
			if ($typma0 == $typma4) {$nmail3 = $nmail4};
		}
	} else {
		if ($typma0 == $typma2) {$nmail3 = $nmail2};
	}
	if ($nmail3 == -1) { die "Probleme de correspondance face-maillage "};
        my @tab1 = ($no1,$no2,$no3,$no4);
        #my @tab1 = @{$mail[$nmail1][$el1]};
	#print "@tab1\n";
	#
	# On boucle sur les element du bord
	for my $el2 (0 .. ($mail_nbel[$nmail3] - 1)) {
		my $no10 = $mail[$nmail3][$el2][0];
		my $x2 = $points[$noeuds[$no10-1] - 1][0];
		my $y2 = $points[$noeuds[$no10-1] - 1][1];
		my $z2 = $points[$noeuds[$no10-1] - 1][2];
		my $dist1 = (($x1 - $x2)**2 + ($y1 - $y2)**2 + ($z1 - $z2)**2)**0.5;
		if ($dist1 < ($coef1 * $dimelt1)) {
			my $no20 = $mail[$nmail3][$el2][2];
			my $no30 = $mail[$nmail3][$el2][4];
			if ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20)) & (inlist(@tab1,$no30))){
				my $si1 = 0;
				#my @tab2 = @{$mail[$nmail3][$el2]};
				my @tab2 = ($no10,$no20,$no30);
				if (inlist(@tab2,$no100)){$si1++};
				if (inlist(@tab2,$no200)){$si1+=2};
				if (inlist(@tab2,$no300)){$si1+=4};
				my $nnum1 = abs $corresp_num_el[$nmail1][$el1];
				if ($val1 eq 'SURF') {
					print FIS "$nnum1,S$tab0[$si1]\n";
				} else {
					print FIS "$nnum1,P$tab0[$si1],$val1\n";
				}
				$reste --;
			};
		};	
		
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element CU20 (cas avec bords)
#========================================================================================
#
sub ac_CU20 
{{{
	my($nmail1, $el1, $nmail2, $val1) = @_;
	# type d'element sur le bord
	my $typma0 = 10;
	my @tab0;
	$tab0[0] = 2;
	$tab0[1] = 6;
	$tab0[3] = 3;
	$tab0[4] = 5;
	$tab0[6] = 4;
	$tab0[7] = 1;
	#
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][2];
	my $no3 = $mail[$nmail1][$el1][4];
	my $no4 = $mail[$nmail1][$el1][6];
	my $no5 = $mail[$nmail1][$el1][12];
	my $no6 = $mail[$nmail1][$el1][14];
	my $no7 = $mail[$nmail1][$el1][16];
	my $no8 = $mail[$nmail1][$el1][18];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x3 = $points[$noeuds[$no7-1] - 1][0];
	my $y3 = $points[$noeuds[$no7-1] - 1][1];
	my $z3 = $points[$noeuds[$no7-1] - 1][2];
	$dimelt1 = (($x1 - $x3)**2 + ($y1 - $y3)**2 + ($z1 - $z3)**2)**0.5;
	#
	my $no100 = $no1; my $no200 = $no2; my $no300 = $no3;
	if ($corresp_num_el[$nmail1][$el1]<0.) {$no100 = $no1; $no200 = $no4; $no300 = $no4;};
        #
	# On regarde dans le bord
	my $nmail3 = -1;
	my $typma2 = $mail_tyel[$nmail2];
	if ($typma2 == 0) {
		my $nbref2 = $#{ $mail[$nmail2][1]} ;
		for my $ref2 (1 .. $nbref2){
			my $nmail4 = $mail[$nmail2][1][$ref2] - 1;
			my $typma4 = $mail_tyel[$nmail4];
			if ($typma0 == $typma4) {$nmail3 = $nmail4};
		}
	} else {
		if ($typma0 == $typma2) {$nmail3 = $nmail2};
	}
	if ($nmail3 == -1) { die "Probleme de correspondance face-maillage "};
        my @tab1 = ($no1,$no2,$no3,$no4,$no5,$no6,$no7,$no8);
        #my @tab1 = @{$mail[$nmail1][$el1]};
	#print "@tab1\n";
	#
	# On boucle sur les element du bord
	for my $el2 (0 .. ($mail_nbel[$nmail3] - 1)) {
		my $no10 = $mail[$nmail3][$el2][0];
		my $x2 = $points[$noeuds[$no10-1] - 1][0];
		my $y2 = $points[$noeuds[$no10-1] - 1][1];
		my $z2 = $points[$noeuds[$no10-1] - 1][2];
		my $dist1 = (($x1 - $x2)**2 + ($y1 - $y2)**2 + ($z1 - $z2)**2)**0.5;
		if ($dist1 < ($coef1 * $dimelt1)) {
			my $no20 = $mail[$nmail3][$el2][2];
			my $no30 = $mail[$nmail3][$el2][4];
			my $no40 = $mail[$nmail3][$el2][6];
			if ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20)) & (inlist(@tab1,$no30)) & (inlist(@tab1,$no40))){
				my $si1 = 0;
				my @tab2 = ($no10,$no20,$no30,$no40);
				#my @tab2 = @{$mail[$nmail3][$el2]};
				if (inlist(@tab2,$no100)){$si1++};
				if (inlist(@tab2,$no200)){$si1+=2};
				if (inlist(@tab2,$no300)){$si1+=4};
				my $nnum1 = abs $corresp_num_el[$nmail1][$el1];
				if ($val1 eq 'SURF') {
					print FIS "$nnum1,S$tab0[$si1]\n";
				} else {
					print FIS "$nnum1,P$tab0[$si1],$val1\n";
				}
				$reste --;
			};
		};	
		
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element PR15 (cas avec bords)
#========================================================================================
#
sub ac_PR15 
{{{
	my($nmail1, $el1, $nmail2, $val1) = @_;
	# type d'element sur le bord
	my $typma01 = 6;
	my $typma02 = 10;
	my @tab0;
	$tab0[0] = 2;
	$tab0[3] = 3;
	$tab0[5] = 5;
	$tab0[6] = 4;
	$tab0[7] = 1;
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][2];
	my $no3 = $mail[$nmail1][$el1][4];
	my $no4 = $mail[$nmail1][$el1][9];
	my $no5 = $mail[$nmail1][$el1][11];
	my $no6 = $mail[$nmail1][$el1][13];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x3 = $points[$noeuds[$no6-1] - 1][0];
	my $y3 = $points[$noeuds[$no6-1] - 1][1];
	my $z3 = $points[$noeuds[$no6-1] - 1][2];
	$dimelt1 = (($x1 - $x3)**2 + ($y1 - $y3)**2 + ($z1 - $z3)**2)**0.5;
	#
	#
	my $no100 = $no1; my $no200 = $no2; my $no300 = $no3;
	if ($corresp_num_el[$nmail1][$el1]<0.) {$no100 = $no1; $no200 = $no3; $no300 = $no2;};
        #
	# On regarde dans le bord
	my @nmail3;
	$nmail3[0] = -1;
	$nmail3[1] = -1;
	my $nb_mail3 = -1;
	my $typma2 = $mail_tyel[$nmail2];
        #my @tab1 = @{$mail[$nmail1][$el1]};
        my @tab1 = ($no1,$no2,$no3,$no4,$no5,$no6);
	#
	if ($typma2 == 0) {
		my $nbref2 = $#{ $mail[$nmail2][1]} ;
		for my $ref2 (1 .. $nbref2){
			my $nmail4 = $mail[$nmail2][1][$ref2] - 1;
			my $typma4 = $mail_tyel[$nmail4];
			if (($typma01 == $typma4) || ($typma02 == $typma4)) {
				$nb_mail3++;
				$nmail3[$nb_mail3] = $nmail4;
			};
		}
	} else {
		if (($typma01 == $typma2) || ($typma02 == $typma2)) {
			$nb_mail3++;
			$nmail3[$nb_mail3] = $nmail2;
		};
	}
	if ($nb_mail3 == -1) { 
		die "Probleme de correspondance face-maillage ";
	} else {
		for my $kk (0 .. $nb_mail3) {
			#my @tab1 = ($no1,$no2,$no3);
			#print "@tab1\n";
			#
			# On boucle sur les element du bord
			$nmail33 = $nmail3[$kk];
			for my $el2 (0 .. ($mail_nbel[$nmail33] - 1)) {
				my $no10 = $mail[$nmail33][$el2][0];
				my $x2 = $points[$noeuds[$no10-1] - 1][0];
				my $y2 = $points[$noeuds[$no10-1] - 1][1];
				my $z2 = $points[$noeuds[$no10-1] - 1][2];
				my $dist1 = (($x1 - $x2)**2 + ($y1 - $y2)**2 + ($z1 - $z2)**2)**0.5;
				if ($dist1 < ($coef1 * $dimelt1)) {
					my $no20 = $mail[$nmail33][$el2][2];
					my $no30 = $mail[$nmail33][$el2][4];
					my $no40 = $mail[$nmail33][$el2][6];
					my $ttest1;
					if ($mail_tyel[$nmail33] == $typma01) {
						$ttest1 = ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20)) & (inlist(@tab1,$no30)));
					} else {
						$ttest1 = ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20)) & (inlist(@tab1,$no30)) & (inlist(@tab1,$no40)));
					};
					if ($ttest1){
						my $si1 = 0;
						my @tab2 = ($no10,$no20,$no30,$no40);
	#					if ($mail_tyel[$nmail33] == $typma01) {

						#my @tab2 = @{$mail[$nmail33][$el2]};
						if (inlist(@tab2,$no100)){$si1++};
						if (inlist(@tab2,$no200)){$si1+=2};
						if (inlist(@tab2,$no300)){$si1+=4};
						my $nnum1 = abs $corresp_num_el[$nmail1][$el1];
						if ($val1 eq 'SURF') {
							print FIS "$nnum1,S$tab0[$si1]\n";
						} else {
							print FIS "$nnum1,P$tab0[$si1],$val1\n";
						}
						$reste --;
					};
				};
				
			};
		};
	};
	return;
}}};
#
#========================================================================================
# Ecriture d'un element PY13 (cas avec bords)
#========================================================================================
#
sub ac_PY13 
{{{
	my($nmail1, $el1, $nmail2, $val1) = @_;
	# type d'element sur le bord
	my $typma01 = 6;
	my $typma02 = 10;
	my @tab0;
	$tab0[1] = 5;
	$tab0[3] = 2;
	$tab0[4] = 4;
	$tab0[6] = 3;
	$tab0[7] = 1;
	my $no1 = $mail[$nmail1][$el1][0];
	my $no2 = $mail[$nmail1][$el1][2];
	my $no3 = $mail[$nmail1][$el1][4];
	my $no4 = $mail[$nmail1][$el1][6];
	my $no5 = $mail[$nmail1][$el1][12];
	my $x1 = $points[$noeuds[$no1-1] - 1][0];
	my $y1 = $points[$noeuds[$no1-1] - 1][1];
	my $z1 = $points[$noeuds[$no1-1] - 1][2];
	my $x3 = $points[$noeuds[$no5-1] - 1][0];
	my $y3 = $points[$noeuds[$no5-1] - 1][1];
	my $z3 = $points[$noeuds[$no5-1] - 1][2];
	$dimelt1 = (($x1 - $x3)**2 + ($y1 - $y3)**2 + ($z1 - $z3)**2)**0.5;
	#
	#
	my $no100 = $no1; my $no200 = $no2; my $no300 = $no3;
	if ($corresp_num_el[$nmail1][$el1]<0.) {$no100 = $no1; $no200 = $no3; $no300 = $no2;};
        #
	# On regarde dans le bord
	my @nmail3;
	$nmail3[0] = -1;
	$nmail3[1] = -1;
	my $nb_mail3 = -1;
	my $typma2 = $mail_tyel[$nmail2];
        #my @tab1 = @{$mail[$nmail1][$el1]};
        my @tab1 = ($no1,$no2,$no3,$no4,$no5);
	#
	if ($typma2 == 0) {
		my $nbref2 = $#{ $mail[$nmail2][1]} ;
		for my $ref2 (1 .. $nbref2){
			my $nmail4 = $mail[$nmail2][1][$ref2] - 1;
			my $typma4 = $mail_tyel[$nmail4];
			if (($typma01 == $typma4) || ($typma02 == $typma4)) {
				$nb_mail3++;
				$nmail3[$nb_mail3] = $nmail4;
			};
		}
	} else {
		if (($typma01 == $typma2) || ($typma02 == $typma2)) {
			$nb_mail3++;
			$nmail3[$nb_mail3] = $nmail2;
		};
	}
	if ($nb_mail3 == -1) { 
		die "Probleme de correspondance face-maillage ";
	} else {
		for my $kk (0 .. $nb_mail3) {
			#my @tab1 = ($no1,$no2,$no3);
			#print "@tab1\n";
			#
			# On boucle sur les element du bord
			$nmail33 = $nmail3[$kk];
			for my $el2 (0 .. ($mail_nbel[$nmail33] - 1)) {
				my $no10 = $mail[$nmail33][$el2][0];
				my $x2 = $points[$noeuds[$no10-1] - 1][0];
				my $y2 = $points[$noeuds[$no10-1] - 1][1];
				my $z2 = $points[$noeuds[$no10-1] - 1][2];
				my $dist1 = (($x1 - $x2)**2 + ($y1 - $y2)**2 + ($z1 - $z2)**2)**0.5;
				if ($dist1 < ($coef1 * $dimelt1)) {
					my $no20 = $mail[$nmail33][$el2][2];
					my $no30 = $mail[$nmail33][$el2][4];
					my $no40 = $mail[$nmail33][$el2][6];
					my $ttest1;
					if ($mail_tyel[$nmail33] == $typma01) {
						$ttest1 = ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20)) & (inlist(@tab1,$no30)));
					} else {
						$ttest1 = ((inlist(@tab1,$no10)) & (inlist(@tab1,$no20)) & (inlist(@tab1,$no30)) & (inlist(@tab1,$no40)));
					};
					if ($ttest1){
						my $si1 = 0;
						my @tab2 = ($no10,$no20,$no30,$no40);
	#					if ($mail_tyel[$nmail33] == $typma01) {

						#my @tab2 = @{$mail[$nmail33][$el2]};
						if (inlist(@tab2,$no100)){$si1++};
						if (inlist(@tab2,$no200)){$si1+=2};
						if (inlist(@tab2,$no300)){$si1+=4};
						my $nnum1 = abs $corresp_num_el[$nmail1][$el1];
						if ($val1 eq 'SURF') {
							print FIS "$nnum1,S$tab0[$si1]\n";
						} else {
							print FIS "$nnum1,P$tab0[$si1],$val1\n";
						}
						$reste --;
					};
				};
				
			};
		};
	};
	return;
}}};
#
#========================================================================================
# Les informations pour l'utilisation
#========================================================================================
#
sub sortie_usage 
{{{
        print "  \n";
        print "========================================================  \n";
        print "cast2aba.pl : convertion de maillages CAST3M vers ABAQUS\n";
        print "Laurent CHAMPANEY                              Mars 2002\n";
        print "========================================================  \n";
        print "  \n";
        print "Usage :\n";
        print "-----  \n";
        print "  cast2aba.pl [-r][-v][-h] nom \n";
        print "  \n";
        print "  lit maillage.sauv et le converti en maillage.inp  \n";
        print "    en suivant les instructions contenues \n";
        print "    maillage.c2a. maillage.sauv est issu d'un SAUV FORMAT\n";
        print "    dans castem et contient tous les maillages\n";
        print "    a utiliser.\n";
        print "  \n";
        print "    -v donne des infos pendant l'execution\n";
        print "    -h donne ces infos                    \n";
        print "    -r passe les elements en integration reduite\n";
        print "  \n";
        print "========================================================  \n";
        print "  \n";
        print "Structure du fichier maillage.c2a \n";
        print "  \n";
        print "-- debut du fichier  \n";
        print "NSET NSETAB1 = NUAGCA1\n";
        print "ELSET ELSETAB1 = MAILCA1\n";
        print "SDLOAD MAILCA1 MAILCA2 val1\n";
        print "SURFACE SURAB1 = MAILCA1 MAILCA2 \n";
        print "*** \n";
        print " ...\n";
        print " ...\n";
        print "*** \n";
        print "-- fin du fichier  \n";
        print "  \n";
        print "Le fichier peut etre ecrit en majuscules ou en minuscules  \n";
        print "  \n";
        print "Pour les NSETs : \n";
        print " - NSETAB1 est le nom du NSET dans abaqus \n";
        print " - NUAGCA1 est le nom du nuage de points dans castem \n";
        print "  (Il s'agit bien d'un nuage de points obtenu par   \n";
        print "   exemple par CHAN MAIL1 POI1, ou par l'operateur  \n";
        print "   POIN.) \n";
        print "  \n";
        print "Pour les ELSETs : \n";
        print " - ELSETAB1 est le nom du ELSET dans abaqus \n";
        print " - MAILCA1 est le nom du maillage dans castem \n";
        print "  \n";
        print "Pour les DLOADs : \n";
        print " - MAILCA1 est le nom du maillage (surface ou volume) \n";
        print "   sur lequel s'appuient les efforts dans castem. \n";
        print "   (Il doit faire partie des ELSET...) \n";
        print " - MAILCA2 est le nom du maillage (ligne ou surface) \n";
        print "   ou sont appliques les efforts dans castem. \n";
        print "  \n";
        print "Pour les SURFACEs : \n";
        print " - SURFAB est le nom du de la surface dans abaqus \n";
        print " - MAILCA1 est le nom du maillage (surface ou volume) \n";
        print "   sur lequel s'appuit cette surface dans castem. \n";
        print "   (Il doit faire partie des ELSET...) \n";
        print " - MAILCA2 est le nom du maillage (ligne ou surface) \n";
        print "   de la surface dans castem. \n";
        print "  \n";
        print "Pour le reste : \n";
        print " - tout ce qui est en les lignes contenant '***' \n";
        print "   apparait directement dans maillage.inp avant le   \n";
        print "   *STEP ou sont definit les DLOAD (si il y      \n";
        print "   en a). On peut placer la les *MATERIAL,       \n";
        print "   *BOUNDARY, *SOLID SECTION, ...                \n";
        print "  \n";
        print "========================================================  \n";
        print "  \n";
        print " La procedure donne dans abaqus le type d'element\n";
        print "    suivant selon qu'on est en axi, DP, CP ou 3D :  \n";
        print "  \n";
	print "       # En axisymetrique\n";
	print "                  SEG2 -> SAX1\n";
	print "                  SEG3 -> SAX2\n";
	print "                  TRI3 -> CAX3\n";
	print "                  TRI6 -> CAX6\n";
	print "                  QUA4 -> CAX4\n";
	print "                  QUA8 -> CAX8\n";
	print "       # En deformations planes\n";
	print "                  SEG2 -> B21\n";
	print "                  SEG3 -> B23\n";
	print "                  TRI3 -> CPE3\n";
	print "                  TRI6 -> CPE6\n";
	print "                  QUA4 -> CPE4\n";
	print "                  QUA8 -> CPE8\n";
	print "       # En contraintes planes\n";
	print "                  SEG2 -> B21\n";
	print "                  SEG3 -> B23\n";
	print "                  TRI3 -> CPS3\n";
	print "                  TRI6 -> CPS6\n";
	print "                  QUA4 -> CPS4\n";
	print "                  QUA8 -> CPS8\n";
	print "       # en 3D\n";
	print "                  SEG2 -> B31\n";
	print "                  SEG3 -> B33\n";
	print "                  TRI3 -> S3\n";
	print "                  TRI6 -> STRI65\n";
	print "                  QUA4 -> S4\n";
	print "                  QUA8 -> S8R\n";
	print "                  CUB8 -> C3D8\n";
	print "                  CU20 -> C3D20\n";
	print "                  PRI6 -> C3D6\n";
	print "                  PR15 -> C3D15\n";
	print "                  TET4 -> C3D4\n";
	print "                  TE10 -> C3D10\n";
        print "  \n";
        print " Pour avoir un autre type d'element, utiliser la syntaxe \n";
        print "  suivante dans le fichier maillage.c2a : \n";
        print "  ELSET ELSETAB1 = MAILCA1 NOMEL1\n";
        print " ou NOMEL1 est le type d'element voulu pour le ELSET.\n";
        print "  \n";
        print "========================================================  \n";
        print "cast2aba.pl : convertion de maillages CAST3M vers ABAQUS\n";
        print "Laurent CHAMPANEY                              Mars 2002\n";
        print "========================================================  \n";
        print "  \n";
#
	return;
}}};
