muMECH  1.0
meso2d.cpp
Go to the documentation of this file.
1 //********************************************************************************************************
2 // code: # # ###### ##### ##### ##### ######
3 // ## ## # # # # # # # # #
4 // # # # # # # # # # # #
5 // # # # ##### ##### # # ##### # #
6 // # # # # # # # # #
7 // # # # # # # # # # #
8 // # # ###### ##### ##### ####### ######
9 //
10 // name: meso2d.h
11 // Copyright: Daniel Rypl
12 // Czech Technical University in Prague,
13 // Faculty of Civil Engineering, Department of Structural Mechanics,
14 // Thakurova 7, 166 29 Prague, Czech Republic,
15 // email: drypl@fsv.cvut.cz
16 //
17 // language: C, C++
18 // license: This program is free software; you can redistribute it and/or modify
19 // it under the terms of the GNU Lesser General Public License as published by
20 // the Free Software Foundation; either version 2 of the License, or
21 // (at your option) any later version.
22 //
23 // This program is distributed in the hope that it will be useful,
24 // but WITHOUT ANY WARRANTY; without even the implied warranty of
25 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 // GNU Lesser General Public License for more details.
27 //
28 // You should have received a copy of the GNU Lesser General Public License
29 // along with this program; if not, write to the Free Software
30 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 //********************************************************************************************************
32 
33 #include <stdio.h>
34 #include <stdlib.h>
35 //#include <string.h>
36 //#include <ctype.h>
37 #include <math.h>
38 #include <stdarg.h>
39 
40 #include "meso2d.h"
41 
42 namespace meso2d {
43 
44 //#ifndef ELIXIR
45 //#define ELIXIR
46 //#endif
47 //
48 //#ifdef ELIXIR
49 //#include "Esimple.h"
50 //#undef PI
51 //#undef NO
52 //#undef YES
53 //#endif
54 
55 
56 // #define BUFFER_SIZE 1024
57 //
58 // #define REMARK '#'
59 // #define NEWLINE '\n'
60 // #define SPACE ' '
61 // #define TABULATOR '\t'
62 //
63 
64 #define NO_ERROR -1
65 #define WARNING 0
66 #define GENERAL_ERROR 1
67 
68 // #define FILE_OPEN_ERROR 2
69 // #define FILE_READ_ERROR 3
70 // #define FILE_WRITE_ERROR 4
71 // #define MEMORY_ERROR 5
72 #define INPUT_ERROR 6
73 //
74 //
75 
76 #define EPSILON 1.0e-10
77 #define EPSILON_T 1.0e-12
78 
79 //
80 // #define ANGLE 0.001 /* cos(89.94 degs) */
81 //
82 // #define PI M_PI /* 3.14159265358979323846 */
83 //
84 //
85 //
86 #define B_0(T) (1.0-2.0*(T)+(T)*(T))
87 #define B_1(T) (2.0*(1.0-(T))*(T))
88 #define B_2(T) ((T)*(T))
89 //
90 #define dB_0(T) (-2.0+2.0*(T))
91 #define dB_1(T) (2.0-4.0*(T))
92 #define dB_2(T) (2.0*(T))
93 //
94 //
95 // #define copy_vec(DEST, SRC) {(DEST).x = (SRC).x; (DEST).y = (SRC).y;}
96 #define size_vec(VEC) ((VEC).x * (VEC).x + (VEC).y * (VEC).y)
97 
98 #define dist_point(PNT1, PNT2) (((PNT1).x - (PNT2).x) * ((PNT1).x - (PNT2).x) + \
99  ((PNT1).y - (PNT2).y) * ((PNT1).y - (PNT2).y))
100 
101 // #define aver_point(RES, PNT1, PNT2) {(RES).x = ((PNT1).x + (PNT2).x) / 2.0; (RES).y = ((PNT1).y + (PNT2).y) / 2.0;}
102 //
103 // #define mul_vec(VEC, VALUE) {(VEC).x *= (VALUE); (VEC).y *= (VALUE);}
104 // #define div_vec(VEC, VALUE) {(VEC).x /= (VALUE); (VEC).y /= (VALUE);}
105 // #define add_vec(RES, VEC1, VEC2) {(RES).x = (VEC1).x + (VEC2).x; (RES).y = (VEC1).y + (VEC2).y;}
106 #define sub_vec(RES, VEC1, VEC2) {(RES).x = (VEC1).x - (VEC2).x; (RES).y = (VEC1).y - (VEC2).y;}
107 //
108 //
109 #define dot_product(VEC1, VEC2) ((VEC1).x * (VEC2).x + (VEC1).y * (VEC2).y)
110 //
111 //
112 //
113 
114 //typedef enum logic logic;
115 
116 //
117 // typedef struct point_rec point_rec;
118 //
119 // typedef struct ellipse_rec ellipse_rec;
120 // typedef struct cylinder_rec cylinder_rec;
121 // typedef struct crack_rec crack_rec;
122 //
123 //
124 //
125 
126 enum logic {
127  NO = 0,
128  YES = 1
129 };
130 
131 //
132 //
133 
134 //
135 //
136 
137 //
138 //
139 // struct cylinder_rec{
140 // point_rec center;
141 // double radius, height;
142 // double internal_msz, boundary_msz;
143 // int property;
144 // point_rec lower_left, lower_right, upper_left, upper_right;
145 // };
146 //
147 //
148 // struct crack_rec{
149 // int id;
150 // ellipse_rec *ellipse;
151 // point_rec center, tip;
152 // int interface, bc;
153 // double length, angle, radius;
154 // double crack_msz, tip_msz;
155 // double cos_angle, sin_angle;
156 // int quad;
157 // int curve;
158 // char bc_spec[128];
159 // };
160 //
161 //
162 //
163 // static char *geom_file_name = NULL;
164 // static char *t3d_in_file_name = NULL;
165 // static char *ctrl_file_name = NULL;
166 //
167 // static FILE *geom_file = NULL;
168 // static FILE *t3d_in_file = NULL;
169 // static FILE *ctrl_file = NULL;
170 //
171 
172 static double epsilon = EPSILON;
173 
174 //
175 // static double min_x, max_x;
176 // static double min_y, max_y;
177 //
178 // static double gmsz = 0.0;
179 // static int prop = 0;
180 //
181 // static char line_buffer[BUFFER_SIZE];
182 //
183 // static int vertex_id = 0;
184 // static int curve_id = 0;
185 // static int patch_id = 0;
186 //
187 // static int crack_id = 0;
188 //
189 // static logic default_msz = NO;
190 // static logic bc = NO;
191 //
192 //
193 // #ifdef ELIXIR
194 //
195 // #define FONT "-adobe-courier-bold-r-normal--*-120-*-*-m-*-iso8859-1"
196 //
197 // static EPixel green, red, yellow, blue, magenta, black;
198 // static Font font;
199 //
200 // static void
201 // draw_point(point_rec *pnt, EPixel color);
202 // static void
203 // draw_line(point_rec *pnt1, point_rec *pnt2, EPixel color);
204 // static void
205 // draw_elliptic_arc(point_rec *pnt1, point_rec *pnt2, point_rec *pnt3, double w1, double w2, double w3, EPixel color);
206 //
207 // static void
208 // draw_cylinder(cylinder_rec *cylinder, EPixel color);
209 // static void
210 // draw_ellipse(ellipse_rec *ellipse, EPixel color);
211 // static void
212 // draw_crack(crack_rec *crack, EPixel color);
213 // #endif
214 //
215 //
216 // static void
217 // write_ellipse(ellipse_rec *ellipse);
218 // static void
219 // write_crack(crack_rec *crack);
220 // static void
221 // write_cylinder(cylinder_rec *cylinder, ellipse_rec *ellipse_array, crack_rec *crack_array, int ellipses, int cracks);
222 //
223 // static logic
224 // check_ellipse_inside_cylinder(ellipse_rec *ellipse, cylinder_rec *cylinder);
225 
226 // Lukasovo - presunuto do headeru
227 // logic check_ellipse_ellipse_overlap (ellipse_rec *ellipse1, ellipse_rec *ellipse2);
228 
229 // static logic
230 // check_crack_cylinder_intersection(crack_rec *crack, cylinder_rec *cylinder);
231 // static logic
232 // check_crack_ellipse_intersection(crack_rec *crack, ellipse_rec *ellipse);
233 // static logic
234 // check_crack_crack_intersection(crack_rec *crack1, crack_rec *crack2);
235 // static logic
236 // check_crack_inside_ellipse(crack_rec *crack, ellipse_rec *ellipse);
237 //
238 // static logic
239 // check_ellipse_line_intersection(ellipse_rec *ellipse, point_rec *point1, point_rec *point2);
240 
241 static logic check_point_inside_ellipse (point_rec *point, ellipse_rec *ellipse);
242 
243 // static logic
244 // check_line_line_intersection(point_rec *pnta1, point_rec *pnta2, point_rec *pntb1, point_rec *pntb2);
245 //
246 
247 static int project_point_to_ellipse (point_rec *point, ellipse_rec *ellipse, point_rec *pnt, double *t_par);
248 static void get_ellipse_point_quadrant (ellipse_rec *ellipse, int quadrant, double t, point_rec *pnt);
249 
250 // static double
251 // get_ellipse_gradient_quadrant(ellipse_rec *ellipse, int quadrant, double t, point_rec *grad);
252 // static void
253 // get_ellipse_normal_quadrant(ellipse_rec *ellipse, int quadrant, double t, point_rec *normal);
254 //
255 
256 static void get_ellipse_point (ellipse_rec *ellipse, double t, point_rec *pnt);
257 static double get_ellipse_gradient (ellipse_rec *ellipse, double t, point_rec *grad);
258 
259 // static void
260 // get_ellipse_normal(ellipse_rec *ellipse, double t, point_rec *normal);
261 //
262 
263 static void transform_from_global_to_local (point_rec *global, point_rec *local, point_rec *origin, double cos_angle, double sin_angle);
264 
265 static void transform_from_local_to_global (point_rec *global, point_rec *local, point_rec *origin, double cos_angle, double sin_angle);
266 //
267 // static char *
268 // get_next_record(FILE *file, char *file_name, char *err_msg);
269 // static char *
270 // get_next_relevant_record(FILE *file, char *file_name, char *err_msg);
271 //
272 // static void
273 // write_record(FILE *file, char *file_name, char *buffer);
274 //
275 
276 static void error_message (int exit_code, const char *format, ...);
277 
278 
279 
280 
283 {
284  if (L.max <= 0.0) meso2d::error_message (INPUT_ERROR, "Positive major half-axis size of inclusion %d required", L.id + 1);
285  if (L.min <= 0.0) meso2d::error_message (INPUT_ERROR, "Positive minor half-axis size of inclusion %d required", L.id + 1);
286  if (L.min > L.max) meso2d::error_message (INPUT_ERROR, "Invalid half-axis ordering of inclusion %d", L.id + 1);
287 
288  if (L.internal_msz < 0.0) meso2d::error_message (INPUT_ERROR, "Positive internal mesh size of inclusion %d required", L.id + 1);
289  if (L.boundary_msz < 0.0) meso2d::error_message (INPUT_ERROR, "Positive boundary mesh size of inclusion %d required", L.id + 1);
290  if (L.property < 0) meso2d::error_message (INPUT_ERROR, "Non-negative property of inclusion %d required", L.id + 1);
291  if (L.interface < 0) meso2d::error_message (INPUT_ERROR, "Non-negative interface of inclusion %d required", L.id + 1);
292  if (L.bc < 0) meso2d::error_message (INPUT_ERROR, "Non-negative boundary condition of inclusion %d required", L.id + 1);
293 
294  // Uhel je jiz v radianech
295  if (L.angle < -6.28318531 || L.angle > 6.28318531)
296  meso2d::error_message (INPUT_ERROR, "Invalid angle of inclusion %d", L.id + 1);
297 
298  if (L.property == 0 && L.interface != 0) {
299  meso2d::error_message (WARNING, "Empty inclusion %d cannot have interface ==> interface ignored", L.id + 1);
300  L.interface = 0;
301  }
302  if (L.interface == 0 && L.bc != 0) {
303  meso2d::error_message (WARNING, "Inclusion without interface cannot be subjected to bc ==> bc ignored", L.id + 1);
304  L.bc = 0;
305  }
306 
307  return;
308 }
309 
310 bool isZero (double zero, double a)
311 {
312  if (a == 0.0) return true;
313  if (-zero<a && a<zero) return true;
314  else return false;
315 }
318 {
319  meso2d::point_rec point;
320 
321  // Two ellipses with centroids on the x-axis both rotated 90/270 DEG with small distance between
322  // are wrongly evaluated as overlaped.
323  // I cannot find the reason, however the following rounding to 0.0 repairs this problem.
324  L.cos_angle = cos (L.angle);
325  L.sin_angle = sin (L.angle);
326 
327  double d = 0.0;
328  double zer = 1.e-6;
329  for (int i=0; i<3; i++) {
330  if (i==0) d = -1.0;
331  if (i==1) d = 0.0;
332  if (i==2) d = 1.0;
333 
334  if (isZero(zer, L.cos_angle - d)) L.cos_angle = d;
335  if (isZero(zer, L.sin_angle - d)) L.sin_angle = d;
336  }
337 
338 
339  L.patch = 0;
340 
341  point.x = L.max;
342  point.y = 0.0;
344 
345  point.x = L.max;
346  point.y = L.min;
348 
349  point.x = 0.0;
350  point.y = L.min;
352 
353  return;
354 }
355 
356 
357 //
358 // int
359 // main(int argc, char** argv)
360 // {
361 // cylinder_rec cylinder;
362 // ellipse_rec *ellipse_array = NULL, *ellipse = NULL, *el = NULL;
363 // crack_rec *crack_array = NULL, *crack = NULL, *cr = NULL;
364 // point_rec point, normal;
365 // double t, product, msz;
366 // int i, j, ellipse_id, ellipses, cracks, points, vertices;
367 // char buffer[1024], text[1024];
368 //
369 // #ifdef ELIXIR
370 // EView *view;
371 // BOOLEAN success;
372 // #endif
373 //
374 // if(argc < 4){
375 // fprintf(stderr, "\n");
376 // fprintf(stderr, "Usage: %s geom_file t3d_file ctrl_file [epsilon]\n\n", argv[0]);
377 // fprintf(stderr, " geom_file: description of geometry - input file\n");
378 // fprintf(stderr, " t3d_file : description of t3d model - output file\n");
379 // fprintf(stderr, " ctrl_file: t3d2merlin ctrl file (fragment) - output file\n\n");
380 // fprintf(stderr, " center radius height msz bmsz material\n");
381 // fprintf(stderr, " # of inclusions\n");
382 // fprintf(stderr, " center angle max min msz bmsz material interface bc\n");
383 // fprintf(stderr, " # of cracks\n");
384 // fprintf(stderr, " inclusion center angle length msz tipmsz interface bc radius\n");
385 // fprintf(stderr, " # of ctrl points\n");
386 // fprintf(stderr, " point msz\n\n");
387 // exit(1);
388 // }
389 //
390 // geom_file_name = argv[1];
391 // t3d_in_file_name = argv[2];
392 // ctrl_file_name = argv[3];
393 //
394 // if(argc > 4)epsilon = atof(argv[4]);
395 // if(epsilon < 0.0){
396 // error_message(WARNING, "Positive epsilon required ==> zero used by default");
397 // epsilon = 0.0;
398 // }
399 //
400 // if((geom_file = fopen(geom_file_name, "r")) == NULL)error_message(FILE_OPEN_ERROR, "File %s opening error", geom_file_name);
401 // if((t3d_in_file = fopen(t3d_in_file_name, "w")) == NULL)error_message(FILE_OPEN_ERROR, "File %s opening error", t3d_in_file_name);
402 // if((ctrl_file = fopen(ctrl_file_name, "w")) == NULL)error_message(FILE_OPEN_ERROR, "File %s opening error", ctrl_file_name);
403 //
404 // #ifdef ELIXIR
405 // if(ESIBuildInterface(ESI_GRAPHIC_EDITOR_MASK, 1, argv) != 0){
406 // fprintf(stderr, "Graphic interface error\n");
407 // exit(1);
408 // }
409 // ESIPopup();
410 // view = ElixirNewView("Meso2D", "Meso2D", "midnightblue", "white", 400, 400);
411 // EMAttachView(ESIModel(), view);
412 // EVSetViewOrientation(view, VIEW_ORIENT_TOP);
413 // EVShowAxes(view, NO);
414 // ESIHandleCmd("render ambient 0.1");
415 // EVSetRenderMode(view, NORMAL_RENDERING);
416 //
417 // green = ColorGetPixelFromString("green", &success);
418 // red = ColorGetPixelFromString("red", &success);
419 // yellow = ColorGetPixelFromString("yellow", &success);
420 // blue = ColorGetPixelFromString("blue", &success);
421 // magenta = ColorGetPixelFromString("magenta", &success);
422 // black = ColorGetPixelFromString("black", &success);
423 //
424 // font = FontGetFontFromString(FONT, &success);
425 // if(success == NO)font = FontDefaultFont();
426 // #endif
427 //
428 // get_next_relevant_record(geom_file, geom_file_name, "Missing problem description");
429 // strcpy(text, line_buffer);
430 //
431 // get_next_relevant_record(geom_file, geom_file_name, "Missing cylinder description");
432 // if(sscanf(line_buffer, "%lf %lf %lf %lf %lf %lf %d", &(cylinder.center.x), &(cylinder.center.y),
433 // &(cylinder.radius), &(cylinder.height), &(cylinder.internal_msz), &(cylinder.boundary_msz),
434 // &(cylinder.property)) != 7)
435 // error_message(INPUT_ERROR, "Invalid record - cylinder description");
436 //
437 // if(cylinder.radius <= 0)
438 // error_message(INPUT_ERROR, "Positive cylinder radius required");
439 // if(cylinder.height <= 0)
440 // error_message(INPUT_ERROR, "Positive cylinder height required");
441 // if(cylinder.internal_msz < 0.0)
442 // error_message(INPUT_ERROR, "Positive internal cylinder mesh size required");
443 // if(cylinder.boundary_msz < 0.0)
444 // error_message(INPUT_ERROR, "Positive boundary cylinder mesh size required");
445 // if(cylinder.property <= 0)
446 // error_message(INPUT_ERROR, "Positive cylinder property required");
447 //
448 // min_x = cylinder.center.x - cylinder.radius;
449 // max_x = cylinder.center.x + cylinder.radius;
450 // min_y = cylinder.center.y;
451 // max_y = cylinder.center.y + cylinder.height;
452 //
453 // cylinder.lower_left.x = cylinder.upper_left.x = min_x;
454 // cylinder.lower_right.x = cylinder.upper_right.x = max_x;
455 // cylinder.lower_left.y = cylinder.lower_right.y = min_y;
456 // cylinder.upper_left.y = cylinder.upper_right.y = max_y;
457 //
458 // gmsz = cylinder.internal_msz;
459 // prop = cylinder.property;
460 //
461 // #ifdef ELIXIR
462 // draw_cylinder(&cylinder, green);
463 // EVFitAllIntoView(view);
464 // #endif
465 //
466 // get_next_relevant_record(geom_file, geom_file_name, "Missing number of inclusions");
467 // if(sscanf(line_buffer, "%d", &ellipses) != 1)
468 // error_message(INPUT_ERROR, "Invalid record - number of inclusions");
469 //
470 // if(ellipses < 0)error_message(INPUT_ERROR, "Non-negative number of inclusions required");
471 //
472 // if(ellipses != 0){
473 // if((ellipse_array = calloc(ellipses, sizeof(ellipse_rec))) == NULL)
474 // error_message(MEMORY_ERROR, "Memory allocation error");
475 //
476 // for(i = 0; i < ellipses; i++){
477 // ellipse = &(ellipse_array[i]);
478 // ellipse -> id = i + 1;
479 //
480 // get_next_relevant_record(geom_file, geom_file_name, "Missing inclusion description");
481 // if(sscanf(line_buffer, "%lf %lf %lf %lf %lf %lf %lf %d %d %d", &(ellipse -> center.x), &(ellipse -> center.y),
482 // &(ellipse -> angle), &(ellipse -> max), &(ellipse -> min),
483 // &(ellipse -> internal_msz), &(ellipse -> boundary_msz),
484 // &(ellipse -> property), &(ellipse -> interface), &(ellipse -> bc)) != 10)
485 // error_message(INPUT_ERROR, "Invalid record - inclusion %d description", i + 1);
486 //
487 // if(ellipse -> max <= 0.0)
488 // error_message(INPUT_ERROR, "Positive major half-axis size of inclusion %d required", i + 1);
489 // if(ellipse -> min <= 0.0)
490 // error_message(INPUT_ERROR, "Positive minor half-axis size of inclusion %d required", i + 1);
491 // if(ellipse -> min > ellipse -> max)
492 // error_message(INPUT_ERROR, "Invalid half-axis ordering of inclusion %d", i + 1);
493 // if(ellipse -> internal_msz < 0.0)
494 // error_message(INPUT_ERROR, "Positive internal mesh size of inclusion %d required", i + 1);
495 // if(ellipse -> boundary_msz < 0.0)
496 // error_message(INPUT_ERROR, "Positive boundary mesh size of inclusion %d required", i + 1);
497 // if(ellipse -> property < 0)
498 // error_message(INPUT_ERROR, "Non-negative property of inclusion %d required", i + 1);
499 // if(ellipse -> interface < 0)
500 // error_message(INPUT_ERROR, "Non-negative interface of inclusion %d required", i + 1);
501 // if(ellipse -> bc < 0)
502 // error_message(INPUT_ERROR, "Non-negative boundary condition of inclusion %d required", i + 1);
503 // if(ellipse -> angle < -360.0 || ellipse -> angle > 360.0)
504 // error_message(INPUT_ERROR, "Invalid angle of inclusion %d", i + 1);
505 //
506 // if(ellipse -> property == 0 && ellipse -> interface != 0){
507 // error_message(WARNING, "Empty inclusion %d cannot have interface ==> interface ignored", i + 1);
508 // ellipse -> interface = 0;
509 // }
510 // if(ellipse -> interface == 0 && ellipse -> bc != 0){
511 // error_message(WARNING, "Inclusion without interface cannot be subjected to bc ==> bc ignored", i + 1);
512 // ellipse -> bc = 0;
513 // }
514 //
515 // ellipse -> angle = ellipse -> angle / 180.0 * PI;
516 // ellipse -> cos_angle = cos(ellipse -> angle);
517 // ellipse -> sin_angle = sin(ellipse -> angle);
518 //
519 // ellipse -> crack = NULL;
520 // ellipse -> patch = 0;
521 //
522 // point.x = ellipse -> max;
523 // point.y = 0.0;
524 // transform_from_local_to_global(&(ellipse -> pnt0), &point, &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
525 //
526 // point.x = ellipse -> max;
527 // point.y = ellipse -> min;
528 // transform_from_local_to_global(&(ellipse -> pnt1), &point, &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
529 //
530 // point.x = 0.0;
531 // point.y = ellipse -> min;
532 // transform_from_local_to_global(&(ellipse -> pnt2), &point, &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
533 //
534 // if(check_ellipse_inside_cylinder(ellipse, &cylinder) == NO){
535 // error_message(WARNING, "Inclusion %d intersects cylinder ==> inclusion %d ignored", i + 1, i + 1);
536 // ellipse -> id = -ellipse -> id;
537 //
538 // #ifdef ELIXIR
539 // draw_ellipse(ellipse, blue);
540 // #endif
541 //
542 // continue;
543 // }
544 //
545 // for(j = 0; j < i; j++){
546 // el = &(ellipse_array[j]);
547 // if(el -> id < 0)continue;
548 // if(check_ellipse_ellipse_overlap(ellipse, el) == YES){
549 // error_message(WARNING, "Inclusion %d intersects inclusion %d ==> inclusion %d ignored", i + 1, j + 1, i + 1);
550 // ellipse -> id = -ellipse -> id;
551 //
552 // #ifdef ELIXIR
553 // draw_ellipse(ellipse, blue);
554 // #endif
555 //
556 // break;
557 // }
558 // }
559 // if(ellipse -> id < 0)continue;
560 //
561 // #ifdef ELIXIR
562 // if(ellipse -> interface == 0)
563 // draw_ellipse(ellipse, red);
564 // else
565 // draw_ellipse(ellipse, magenta);
566 // #endif
567 //
568 // }
569 // }
570 //
571 // get_next_relevant_record(geom_file, geom_file_name, "Missing number of cracks");
572 // if(sscanf(line_buffer, "%d", &cracks) != 1)
573 // error_message(INPUT_ERROR, "Invalid record - number of cracks");
574 //
575 // if(cracks < 0)error_message(INPUT_ERROR, "Non-negative number of cracks required");
576 //
577 // if(cracks != 0){
578 // if((crack_array = calloc(cracks, sizeof(crack_rec))) == NULL)
579 // error_message(MEMORY_ERROR, "Memory allocation error");
580 //
581 // for(i = 0; i < cracks; i++){
582 // crack = &(crack_array[i]);
583 // crack -> id = i + 1;
584 //
585 // get_next_relevant_record(geom_file, geom_file_name, "Missing crack description");
586 // if(sscanf(line_buffer, "%d %lf %lf %lf %lf %lf %lf %d %d %lf", &ellipse_id, &(crack -> center.x), &(crack -> center.y),
587 // &(crack -> angle), &(crack -> length), &(crack -> crack_msz), &(crack -> tip_msz),
588 // &(crack -> interface), &(crack -> bc), &(crack -> radius)) != 10)
589 // error_message(INPUT_ERROR, "Invalid record - crack %d description", i + 1);
590 //
591 // if(ellipse_id < 0 || ellipse_id > ellipses)
592 // error_message(INPUT_ERROR, "Invalid inclusion number for crack %d", i + 1);
593 // if(crack -> length <= 0.0)
594 // error_message(INPUT_ERROR, "Positive length of crack %d required", i + 1);
595 // if(crack -> crack_msz < 0.0)
596 // error_message(INPUT_ERROR, "Positive mesh size of crack %d required", i + 1);
597 // if(crack -> tip_msz < 0.0)
598 // error_message(INPUT_ERROR, "Positive tip mesh size of crack %d required", i + 1);
599 // if(crack -> angle < -360.0 || crack -> angle > 360.0)
600 // error_message(INPUT_ERROR, "Invalid angle of crack %d", i + 1);
601 // if(crack -> interface < 0)
602 // error_message(INPUT_ERROR, "Non-negative interface of crack %d required", i + 1);
603 // if(crack -> bc < 0)
604 // error_message(INPUT_ERROR, "Non-negative boundary condition of crack %d required", i + 1);
605 // if(crack -> radius < 0.0)
606 // error_message(INPUT_ERROR, "Non-negative radius of crack %d required", i + 1);
607 // /*
608 // if(crack -> interface == 0 && crack -> radius == 0.0)
609 // error_message(WARNING, "Zero contour path radius assigned to crack %d without interface", i + 1);
610 // if(crack -> interface != 0 && crack -> radius != 0.0)
611 // error_message(WARNING, "Non-zero contour path radius assigned to crack %d with interface", i + 1);
612 // */
613 // crack -> angle = crack -> angle / 180.0 * PI;
614 // crack -> cos_angle = cos(crack -> angle);
615 // crack -> sin_angle = sin(crack -> angle);
616 //
617 // crack -> ellipse = NULL;
618 // crack -> curve = 0;
619 //
620 // if(ellipse_id == 0){
621 // ellipse = NULL;
622 //
623 // crack -> length *= 2.0;
624 //
625 // if(crack -> radius > crack -> length * 0.25){
626 // error_message(WARNING, "Contour radius of crack %d too large ==> radius ignored", i + 1);
627 // crack -> radius = 0.0;
628 // }
629 //
630 // crack -> center.x = crack -> center.x - crack -> cos_angle * crack -> length * 0.5;
631 // crack -> center.y = crack -> center.y - crack -> sin_angle * crack -> length * 0.5;
632 //
633 // crack -> tip.x = crack -> center.x + crack -> cos_angle * crack -> length;
634 // crack -> tip.y = crack -> center.y + crack -> sin_angle * crack -> length;
635 //
636 // for(j = 0; j < ellipses; j++){
637 // el = &(ellipse_array[j]);
638 // if(el -> id < 0)continue;
639 // if(check_crack_ellipse_intersection(crack, el) == YES){
640 // error_message(WARNING, "Crack %d intersects inclusion %d ==> crack %d ignored", i + 1, j + 1, i + 1);
641 // crack -> id = -crack -> id;
642 //
643 // #ifdef ELIXIR
644 // draw_crack(crack, blue);
645 // #endif
646 //
647 // break;
648 // }
649 // if(check_crack_inside_ellipse(crack, el) == YES){
650 // error_message(WARNING, "Crack %d inside inclusion %d ==> crack %d ignored", i + 1, j + 1, i + 1);
651 // crack -> id = -crack -> id;
652 //
653 // #ifdef ELIXIR
654 // draw_crack(crack, blue);
655 // #endif
656 //
657 // break;
658 // }
659 // }
660 // if(crack -> id < 0)continue;
661 // }
662 // else{
663 // ellipse = &(ellipse_array[ellipse_id - 1]);
664 //
665 // if(crack -> radius > crack -> length * 0.75){
666 // error_message(WARNING, "Contour radius of crack %d too large ==> radius ignored", i + 1);
667 // crack -> radius = 0.0;
668 // }
669 //
670 // crack -> quad = project_point_to_ellipse(&(crack -> center), ellipse, &point, &t);
671 // copy_vec(crack -> center, point);
672 // get_ellipse_normal_quadrant(ellipse, crack -> quad, t, &normal);
673 //
674 // product = crack -> cos_angle * normal.x + crack -> sin_angle * normal.y;
675 // if(fabs(product) < ANGLE){
676 // error_message(WARNING, "Crack %d is tangent to inclusion %d ==> crack %d ignored", i + 1, ellipse_id, i + 1);
677 // crack -> id = -crack -> id;
678 //
679 // #ifdef ELIXIR
680 // crack -> tip.x = crack -> center.x + crack -> cos_angle * crack -> length;
681 // crack -> tip.y = crack -> center.y + crack -> sin_angle * crack -> length;
682 // draw_crack(crack, blue);
683 // #endif
684 //
685 // continue;
686 // }
687 //
688 // if(product < 0.0){
689 // /*
690 // error_message(WARNING, "Crack %d intersects inclusion %d ==> crack %d ignored", i + 1, ellipse_id, i + 1);
691 // crack -> id = -crack -> id;
692 //
693 // #ifdef ELIXIR
694 // crack -> tip.x = crack -> center.x + crack -> cos_angle * crack -> length;
695 // crack -> tip.y = crack -> center.y + crack -> sin_angle * crack -> length;
696 // draw_crack(crack, blue);
697 // #endif
698 //
699 // continue;
700 // */
701 // error_message(WARNING, "Crack %d points inside inclusion %d ==> crack %d reverted", i + 1, ellipse_id, i + 1);
702 //
703 // crack -> angle += PI;
704 // if(crack -> angle > 2.0 * PI)crack -> angle -= 2.0 * PI;
705 // crack -> cos_angle *= -1.0;
706 // crack -> sin_angle *= -1.0;
707 // }
708 //
709 // crack -> tip.x = crack -> center.x + crack -> cos_angle * crack -> length;
710 // crack -> tip.y = crack -> center.y + crack -> sin_angle * crack -> length;
711 //
712 // if(ellipse -> id < 0){
713 // error_message(WARNING, "Crack %d is on rejected inclusion ==> crack %d ignored", i + 1, i + 1);
714 // crack -> id = -crack -> id;
715 //
716 // #ifdef ELIXIR
717 // draw_crack(crack, blue);
718 // #endif
719 //
720 // continue;
721 // }
722 //
723 // if(ellipse -> crack != NULL){
724 // if(ellipse -> crack -> id > 0){
725 // error_message(WARNING, "Inclusion %d associated with crack %d ==> crack %d ignored",
726 // ellipse -> id, ellipse -> crack -> id, i + 1);
727 // crack -> id = -crack -> id;
728 //
729 // #ifdef ELIXIR
730 // draw_crack(crack, blue);
731 // #endif
732 //
733 // continue;
734 // }
735 // }
736 // }
737 //
738 // if(check_crack_cylinder_intersection(crack, &cylinder) == YES){
739 // error_message(WARNING, "Crack %d intersects cylinder ==> crack %d ignored", i + 1, i + 1);
740 // crack -> id = -crack -> id;
741 //
742 // #ifdef ELIXIR
743 // draw_crack(crack, blue);
744 // #endif
745 //
746 // continue;
747 // }
748 //
749 // for(j = 0; j < i; j++){
750 // cr = &(crack_array[j]);
751 // if(cr -> id < 0)continue;
752 // if(check_crack_crack_intersection(crack, cr) == YES){
753 // error_message(WARNING, "Crack %d intersects crack %d ==> crack %d ignored", i + 1, j + 1, i + 1);
754 // crack -> id = -crack -> id;
755 //
756 // #ifdef ELIXIR
757 // draw_crack(crack, blue);
758 // #endif
759 //
760 // break;
761 // }
762 // }
763 // if(crack -> id < 0)continue;
764 //
765 // for(j = 0; j < ellipses; j++){
766 // el = &(ellipse_array[j]);
767 // if(el -> id < 0)continue;
768 // if(el == ellipse)continue;
769 // if(check_crack_ellipse_intersection(crack, el) == YES){
770 // error_message(WARNING, "Crack %d intersects inclusion %d ==> crack %d ignored", i + 1, j + 1, i + 1);
771 // crack -> id = -crack -> id;
772 //
773 // #ifdef ELIXIR
774 // draw_crack(crack, blue);
775 // #endif
776 //
777 // break;
778 // }
779 // }
780 // if(crack -> id < 0)continue;
781 //
782 // #ifdef ELIXIR
783 // draw_crack(crack, yellow);
784 // #endif
785 //
786 // if(ellipse != NULL){
787 // crack -> ellipse = ellipse;
788 // ellipse -> crack = crack;
789 // }
790 // }
791 // }
792 //
793 // /* note: text contains \n */
794 // sprintf(buffer, "#\n# %s#\n\n", text);
795 // write_record(t3d_in_file, t3d_in_file_name, buffer);
796 //
797 // sprintf(buffer, "StartMesh\n");
798 // write_record(ctrl_file, ctrl_file_name, buffer);
799 //
800 // /* note: text contains \n */
801 // sprintf(buffer, "\n#\n# %s#\n\n", text);
802 // write_record(ctrl_file, ctrl_file_name, buffer);
803 //
804 // vertex_id = 10;
805 // curve_id = 10;
806 // patch_id = 10;
807 //
808 // for(j = 0; j < ellipses; j++){
809 // ellipse = &(ellipse_array[j]);
810 // write_ellipse(ellipse);
811 // }
812 //
813 // for(j = 0; j < cracks; j++){
814 // crack = &(crack_array[j]);
815 // write_crack(crack);
816 // }
817 //
818 // vertices = vertex_id;
819 //
820 // vertex_id = 0;
821 // curve_id = 0;
822 // patch_id = 0;
823 //
824 // write_cylinder(&cylinder, ellipse_array, crack_array, ellipses, cracks);
825 //
826 // sprintf(buffer, "EndMesh\n");
827 // write_record(ctrl_file, ctrl_file_name, buffer);
828 //
829 // if(bc == YES){
830 // sprintf(buffer, "\n#StartIncrement\n");
831 // write_record(ctrl_file, ctrl_file_name, buffer);
832 //
833 // for(j = 0; j < ellipses; j++){
834 // ellipse = &(ellipse_array[j]);
835 // if(ellipse -> id < 0)continue;
836 // if(ellipse -> bc != 0){
837 // sprintf(buffer, "\n## inclusion no %d (inclusion and matrix surface)\n\n", ellipse -> id);
838 // write_record(ctrl_file, ctrl_file_name, buffer);
839 // write_record(ctrl_file, ctrl_file_name, ellipse -> bc_ellipse_spec);
840 // write_record(ctrl_file, ctrl_file_name, ellipse -> bc_matrix_spec);
841 // sprintf(buffer, "#Tractions 0.0 0.0\n");
842 // write_record(ctrl_file, ctrl_file_name, buffer);
843 // }
844 // }
845 //
846 // for(j = 0; j < cracks; j++){
847 // crack = &(crack_array[j]);
848 // if(crack -> id < 0)continue;
849 // if(crack -> bc != 0){
850 // sprintf(buffer, "\n## crack no %d\n\n", crack -> id);
851 // write_record(ctrl_file, ctrl_file_name, buffer);
852 // write_record(ctrl_file, ctrl_file_name, crack -> bc_spec);
853 // sprintf(buffer, "#Tractions 0.0 0.0\n");
854 // write_record(ctrl_file, ctrl_file_name, buffer);
855 // }
856 // }
857 //
858 // sprintf(buffer, "\n#EndIncrement\n");
859 // write_record(ctrl_file, ctrl_file_name, buffer);
860 // }
861 //
862 // get_next_relevant_record(geom_file, geom_file_name, "Missing number of ctrl points");
863 // if(sscanf(line_buffer, "%d", &points) != 1)
864 // error_message(INPUT_ERROR, "Invalid record - number of ctrl points");
865 //
866 // if(points < 0)error_message(INPUT_ERROR, "Non-negative number of ctrl points required");
867 //
868 // if(points != 0){
869 // vertex_id = vertices;
870 //
871 // sprintf(buffer, "\n\n# control points\n\n");
872 // write_record(t3d_in_file, t3d_in_file_name, buffer);
873 //
874 // for(i = 0; i < points; i++){
875 // get_next_relevant_record(geom_file, geom_file_name, "Missing ctrl point description");
876 // if(sscanf(line_buffer, "%lf %lf %lf", &(point.x), &(point.y), &msz) != 3)
877 // error_message(INPUT_ERROR, "Invalid record - ctrl point %d description", i + 1);
878 //
879 // if(msz < 0.0)
880 // error_message(INPUT_ERROR, "Positive mesh size of ctrl point %d required", i + 1);
881 //
882 // #ifdef ELIXIR
883 // draw_point(&point, green);
884 // #endif
885 //
886 // vertex_id++;
887 // if(msz == 0.0)
888 // sprintf(buffer, "vertex %d virtual xyz %e %e %e\n", vertex_id, point.x, point.y, 0.0);
889 // else
890 // sprintf(buffer, "vertex %d virtual xyz %e %e %e size %e\n", vertex_id, point.x, point.y, 0.0, msz);
891 // write_record(t3d_in_file, t3d_in_file_name, buffer);
892 // }
893 // }
894 //
895 // if(ellipse_array != NULL)free(ellipse_array);
896 // if(crack_array != NULL)free(crack_array);
897 //
898 // if(default_msz == YES){
899 // /*
900 // error_message(WARNING, "Default mesh size (option -d) must be used");
901 // error_message(NO_ERROR, " when running t3d with %s", t3d_in_file_name);
902 // */
903 // sprintf(buffer, "\n\n#\n# t3d -i %s -o %s.out -p 24 -d ???\n#\n\n", t3d_in_file_name, t3d_in_file_name);
904 // }
905 // else
906 // sprintf(buffer, "\n\n#\n# t3d -i %s -o %s.out -p 24\n#\n\n", t3d_in_file_name, t3d_in_file_name);
907 // write_record(t3d_in_file, t3d_in_file_name, buffer);
908 //
909 // fclose(geom_file);
910 // fclose(t3d_in_file);
911 // fclose(ctrl_file);
912 //
913 // #ifdef ELIXIR
914 // ESIEventLoop(YES, "Completed");
915 // #endif
916 //
917 // return(0);
918 // }
919 //
920 //
921 //
922 // static void
923 // write_ellipse(ellipse_rec *ellipse)
924 // {
925 // crack_rec *crack = NULL;
926 // point_rec glob_point[4], loc_point[4], glob_pnt[4], loc_pnt[4], glob_p[2], loc_p[2];
927 // point_rec *g_point[4], *g_pnt[4];
928 // double weight_q = 0.707106781, weight_h = 0.3333333333, bmsz, imsz, cmsz, tmsz, min_msz, dist1, dist2, dist;
929 // int i, k, quadrant, ver_id1, ver_id2, vertices, curves, crack_cur_id;
930 // int matrix_crack_ver_id, interface_crack_ver_id, virtual_curve_id, tip_crack_ver_id, orig_matrix_crack_ver_id;
931 // char buffer[1024], tmp_buffer[1024];
932 //
933 // if(ellipse -> id < 0){
934 // sprintf(buffer, "# inclusion no %d (ignored)\n\n", -ellipse -> id);
935 // write_record(t3d_in_file, t3d_in_file_name, buffer);
936 // return;
937 // }
938 //
939 // if(ellipse -> property == 0)ellipse -> interface = 0;
940 //
941 // bmsz = ellipse -> boundary_msz;
942 // imsz = ellipse -> internal_msz;
943 //
944 // /* vertices */
945 // loc_point[0].x = ellipse -> max;
946 // loc_point[0].y = 0.0;
947 //
948 // loc_point[1].x = 0.0;
949 // loc_point[1].y = ellipse -> min;
950 //
951 // loc_point[2].x = -ellipse -> max;
952 // loc_point[2].y = 0.0;
953 //
954 // loc_point[3].x = 0.0;
955 // loc_point[3].y = -ellipse -> min;
956 //
957 // /* ctrl polygon */
958 // loc_pnt[0].x = ellipse -> max;
959 // loc_pnt[0].y = ellipse -> min;
960 //
961 // loc_pnt[1].x = -ellipse -> max;
962 // loc_pnt[1].y = ellipse -> min;
963 //
964 // loc_pnt[2].x = -ellipse -> max;
965 // loc_pnt[2].y = -ellipse -> min;
966 //
967 // loc_pnt[3].x = ellipse -> max;
968 // loc_pnt[3].y = -ellipse -> min;
969 //
970 // for(i = 0; i < 4; i++){
971 // transform_from_local_to_global(&(glob_point[i]), &(loc_point[i]), &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
972 // transform_from_local_to_global(&(glob_pnt[i]), &(loc_pnt[i]), &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
973 // }
974 //
975 // sprintf(buffer, "\n# inclusion no %d ", ellipse -> id);
976 // if(ellipse -> property == 0)
977 // strcat(buffer, "(hole)");
978 // else{
979 // if(ellipse -> interface == 0)
980 // sprintf(tmp_buffer, "(material %d)", ellipse -> property);
981 // else
982 // sprintf(tmp_buffer, "(material %d, interface %d)", ellipse -> property, ellipse -> interface);
983 // strcat(buffer, tmp_buffer);
984 // }
985 //
986 // crack = ellipse -> crack;
987 // if(crack != NULL){
988 // if(crack -> interface == 0)
989 // sprintf(tmp_buffer, " + crack no %d\n\n", crack -> id);
990 // else
991 // sprintf(tmp_buffer, " + crack no %d (interface %d)\n\n", crack -> id, crack -> interface);
992 // strcat(buffer, tmp_buffer);
993 //
994 // write_record(t3d_in_file, t3d_in_file_name, buffer);
995 // write_record(ctrl_file, ctrl_file_name, buffer);
996 //
997 // cmsz = crack -> crack_msz;
998 // tmsz = crack -> tip_msz;
999 //
1000 // quadrant = crack -> quad;
1001 //
1002 // /* check whether crack is close to endpoints of quadrant */
1003 // dist1 = dist_point(crack -> center, glob_point[quadrant - 1]);
1004 // dist2 = dist_point(crack -> center, glob_point[quadrant % 4]);
1005 // dist = (dist1 < dist2) ? dist1 : dist2;
1006 //
1007 // min_msz = ellipse -> min / 2.0;
1008 // if(gmsz < min_msz && gmsz != 0.0)min_msz = gmsz;
1009 // if(imsz < min_msz && imsz != 0.0)min_msz = imsz;
1010 // if(bmsz < min_msz && bmsz != 0.0)min_msz = bmsz;
1011 // if(cmsz < min_msz && cmsz != 0.0)min_msz = cmsz;
1012 // min_msz *= 2.0;
1013 //
1014 // if(dist < min_msz * min_msz){
1015 //
1016 // /* setup the points that the half-ellipse is always in the first and second quadrants */
1017 // if(dist1 < dist2){
1018 // for(i = 0; i < 4; i++){
1019 // g_point[i] = &(glob_point[(quadrant - 2 + i + 4) % 4]);
1020 // g_pnt[i] = &(glob_pnt[(quadrant - 2 + i + 4) % 4]);
1021 // }
1022 //
1023 // /* calculate ctrl polygon of half-ellipse */
1024 // if(quadrant == 2){
1025 // loc_p[0].x = ellipse -> max;
1026 // loc_p[0].y = 2.0 * ellipse -> min;
1027 //
1028 // loc_p[1].x = -ellipse -> max;
1029 // loc_p[1].y = 2.0 * ellipse -> min;
1030 // }
1031 // if(quadrant == 3){
1032 // loc_p[0].x = -2.0 * ellipse -> max;
1033 // loc_p[0].y = ellipse -> min;
1034 //
1035 // loc_p[1].x = -2.0 * ellipse -> max;
1036 // loc_p[1].y = -ellipse -> min;
1037 // }
1038 // if(quadrant == 4){
1039 // loc_p[0].x = -ellipse -> max;
1040 // loc_p[0].y = -2.0 * ellipse -> min;
1041 //
1042 // loc_p[1].x = ellipse -> max;
1043 // loc_p[1].y = -2.0 * ellipse -> min;
1044 // }
1045 // if(quadrant == 1){
1046 // loc_p[0].x = 2.0 * ellipse -> max;
1047 // loc_p[0].y = -ellipse -> min;
1048 //
1049 // loc_p[1].x = 2.0 * ellipse -> max;
1050 // loc_p[1].y = ellipse -> min;
1051 // }
1052 // }
1053 // else{
1054 // for(i = 0; i < 4; i++){
1055 // g_point[i] = &(glob_point[(quadrant - 1 + i + 4) % 4]);
1056 // g_pnt[i] = &(glob_pnt[(quadrant - 1 + i + 4) % 4]);
1057 // }
1058 //
1059 // /* calculate ctrl polygon of half-ellipse */
1060 // if(quadrant == 1){
1061 // loc_p[0].x = ellipse -> max;
1062 // loc_p[0].y = 2.0 * ellipse -> min;
1063 //
1064 // loc_p[1].x = -ellipse -> max;
1065 // loc_p[1].y = 2.0 * ellipse -> min;
1066 // }
1067 // if(quadrant == 2){
1068 // loc_p[0].x = -2.0 * ellipse -> max;
1069 // loc_p[0].y = ellipse -> min;
1070 //
1071 // loc_p[1].x = -2.0 * ellipse -> max;
1072 // loc_p[1].y = -ellipse -> min;
1073 // }
1074 // if(quadrant == 3){
1075 // loc_p[0].x = -ellipse -> max;
1076 // loc_p[0].y = -2.0 * ellipse -> min;
1077 //
1078 // loc_p[1].x = ellipse -> max;
1079 // loc_p[1].y = -2.0 * ellipse -> min;
1080 // }
1081 // if(quadrant == 4){
1082 // loc_p[0].x = 2.0 * ellipse -> max;
1083 // loc_p[0].y = -ellipse -> min;
1084 //
1085 // loc_p[1].x = 2.0 * ellipse -> max;
1086 // loc_p[1].y = ellipse -> min;
1087 // }
1088 // }
1089 //
1090 // transform_from_local_to_global(&(glob_p[0]), &(loc_p[0]), &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
1091 // transform_from_local_to_global(&(glob_p[1]), &(loc_p[1]), &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
1092 //
1093 // vertices = 5;
1094 // curves = 4 + 1; /* one is virtual */
1095 //
1096 // for(k = 0; k < 4; k++){
1097 //
1098 // /* k = 0 inclusion boundary
1099 // k = 1 matrix boundary
1100 // k = 2 inclusion interface
1101 // k = 3 matrix interface */
1102 //
1103 // if(k == 1){
1104 // sprintf(buffer, "MasterSlave");
1105 // write_record(ctrl_file, ctrl_file_name, buffer);
1106 // }
1107 // if(k == 2){
1108 // sprintf(buffer, "Interface %d", ellipse -> interface);
1109 // write_record(ctrl_file, ctrl_file_name, buffer);
1110 // }
1111 //
1112 // for(i = 0; i < 4; i++){
1113 // if(i == 1)continue;
1114 // vertex_id++;
1115 // if(bmsz == 0.0){
1116 // default_msz = YES;
1117 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, g_point[i] -> x, g_point[i] -> y, 0.0);
1118 // }
1119 // else
1120 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, g_point[i] -> x, g_point[i] -> y, 0.0, bmsz);
1121 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1122 //
1123 // if(k == 1){
1124 // if(ellipse -> interface == 0)
1125 // sprintf(buffer, " Vertex %d %d", vertex_id - vertices, vertex_id);
1126 // else
1127 // sprintf(buffer, " Vertex %d %d Vertex %d %d",
1128 // vertex_id - vertices, vertex_id + vertices, vertex_id, vertex_id + 2 * vertices);
1129 // write_record(ctrl_file, ctrl_file_name, buffer);
1130 // }
1131 // }
1132 //
1133 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1134 //
1135 // /* make virtual curve over the first two quadrants */
1136 // curve_id++;
1137 // sprintf(buffer, "curve %d virtual order 4 vertex %d %d\n", curve_id, vertex_id - 2, vertex_id - 1);
1138 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1139 // virtual_curve_id = curve_id;
1140 //
1141 // if(bmsz == 0.0){
1142 // default_msz = YES;
1143 // sprintf(buffer, "polygon 1 xyz %e %e %e weight %e\n", glob_p[0].x, glob_p[0].y, 0.0, weight_h);
1144 // }
1145 // else
1146 // sprintf(buffer, "polygon 1 xyz %e %e %e weight %e size %e\n", glob_p[0].x, glob_p[0].y, 0.0, weight_h, bmsz);
1147 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1148 //
1149 // if(bmsz == 0.0){
1150 // default_msz = YES;
1151 // sprintf(buffer, "polygon 2 xyz %e %e %e weight %e\n", glob_p[1].x, glob_p[1].y, 0.0, weight_h);
1152 // }
1153 // else
1154 // sprintf(buffer, "polygon 2 xyz %e %e %e weight %e size %e\n", glob_p[1].x, glob_p[1].y, 0.0, weight_h, bmsz);
1155 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1156 //
1157 // for(i = 2; i < 4; i++){
1158 // ver_id1 = vertex_id - 3 + i;
1159 // ver_id2 = ver_id1 + 1;
1160 // if(i == 3)ver_id2 -= 3;
1161 //
1162 // curve_id++;
1163 // sprintf(buffer, "curve %d order 3 vertex %d %d\n", curve_id, ver_id1, ver_id2);
1164 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1165 //
1166 // if(bmsz == 0.0){
1167 // default_msz = YES;
1168 // sprintf(buffer, "polygon 1 xyz %e %e %e weight %e\n", g_pnt[i] -> x, g_pnt[i] -> y, 0.0, weight_q);
1169 // }
1170 // else
1171 // sprintf(buffer, "polygon 1 xyz %e %e %e weight %e size %e\n", g_pnt[i] -> x, g_pnt[i] -> y, 0.0, weight_q, bmsz);
1172 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1173 //
1174 // if(k == 1){
1175 // if(ellipse -> interface == 0)
1176 // sprintf(buffer, " Curve %d %d", curve_id - curves, curve_id);
1177 // else
1178 // sprintf(buffer, " Curve %d %d Curve %d %d",
1179 // curve_id - curves, curve_id + curves, curve_id, curve_id + 2 * curves);
1180 // write_record(ctrl_file, ctrl_file_name, buffer);
1181 // }
1182 // if(k == 2){
1183 // sprintf(buffer, " Curve %d %d", curve_id + curves, curve_id);
1184 // write_record(ctrl_file, ctrl_file_name, buffer);
1185 // }
1186 // }
1187 //
1188 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1189 //
1190 // /* split virtual curve */
1191 // vertex_id++;
1192 // sprintf(buffer, "vertex %d xyz %e %e %e fixed curve %d\n", vertex_id, crack -> center.x, crack -> center.y, 0.0,
1193 // virtual_curve_id);
1194 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1195 //
1196 // if(k == 0 || k == 1){
1197 // matrix_crack_ver_id = vertex_id;
1198 // interface_crack_ver_id = 0;
1199 // }
1200 // if(k == 3)interface_crack_ver_id = vertex_id;
1201 //
1202 // if(k == 1){
1203 // if(ellipse -> interface == 0)
1204 // sprintf(buffer, " Vertex %d %d", vertex_id - vertices, vertex_id);
1205 // else
1206 // sprintf(buffer, " Vertex %d %d Vertex %d %d",
1207 // vertex_id - vertices, vertex_id + vertices, vertex_id, vertex_id + 2 * vertices);
1208 // write_record(ctrl_file, ctrl_file_name, buffer);
1209 // }
1210 //
1211 // vertex_id++;
1212 // if(k == 1 || k == 3 || ellipse -> property == 0){
1213 // sprintf(buffer, "vertex %d xyz %e %e %e fixed curve %d\n", vertex_id, crack -> center.x, crack -> center.y, 0.0,
1214 // virtual_curve_id);
1215 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1216 //
1217 // if(k == 1){
1218 // if(ellipse -> interface == 0)
1219 // sprintf(buffer, " Vertex %d %d", vertex_id - 1 - vertices, vertex_id);
1220 // else{
1221 // if(ellipse -> property == 0)
1222 // sprintf(buffer, " Vertex %d %d Vertex %d %d",
1223 // vertex_id - vertices, vertex_id + vertices, vertex_id, vertex_id + 2 * vertices);
1224 // else
1225 // sprintf(buffer, " Vertex %d %d",
1226 // vertex_id, vertex_id + 2 * vertices);
1227 // }
1228 // write_record(ctrl_file, ctrl_file_name, buffer);
1229 // }
1230 // }
1231 //
1232 // curve_id++;
1233 // sprintf(buffer, "curve %d vertex %d %d fixed curve %d\n", curve_id, vertex_id - 4, vertex_id - 1, virtual_curve_id);
1234 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1235 //
1236 // curve_id++;
1237 // if(k == 1 || k == 3 || ellipse -> property == 0)
1238 // sprintf(buffer, "curve %d vertex %d %d fixed curve %d\n", curve_id, vertex_id, vertex_id - 3, virtual_curve_id);
1239 // else
1240 // sprintf(buffer, "curve %d vertex %d %d fixed curve %d\n", curve_id, vertex_id - 1, vertex_id - 3, virtual_curve_id);
1241 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1242 //
1243 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1244 //
1245 // if(k == 1){
1246 // if(ellipse -> interface == 0){
1247 // sprintf(buffer, " Curve %d %d Curve %d %d",
1248 // curve_id - 1 - curves, curve_id - 1, curve_id - curves, curve_id);
1249 // write_record(ctrl_file, ctrl_file_name, buffer);
1250 // }
1251 // else{
1252 // sprintf(buffer, " Curve %d %d Curve %d %d",
1253 // curve_id - 1 - curves, curve_id - 1 + curves, curve_id - 1, curve_id - 1 + 2 * curves);
1254 // write_record(ctrl_file, ctrl_file_name, buffer);
1255 //
1256 // sprintf(buffer, " Curve %d %d Curve %d %d",
1257 // curve_id - curves, curve_id + curves, curve_id, curve_id + 2 * curves);
1258 // write_record(ctrl_file, ctrl_file_name, buffer);
1259 // }
1260 // }
1261 // if(k == 2){
1262 // sprintf(buffer, " Curve %d %d", curve_id - 1 + curves, curve_id - 1);
1263 // write_record(ctrl_file, ctrl_file_name, buffer);
1264 // sprintf(buffer, " Curve %d %d", curve_id + curves, curve_id);
1265 // write_record(ctrl_file, ctrl_file_name, buffer);
1266 // }
1267 //
1268 // #ifdef HUHU
1269 // vertex_id++;
1270 // sprintf(buffer, "vertex %d xyz %e %e %e fixed curve %d\n", vertex_id, crack -> center.x, crack -> center.y, 0.0,
1271 // virtual_curve_id);
1272 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1273 //
1274 // vertex_id++;
1275 // if(k == 0){
1276 // matrix_crack_ver_id = vertex_id - 1;
1277 // interface_crack_ver_id = 0;
1278 //
1279 // if(ellipse -> property != 0)
1280 // sprintf(buffer, "vertex %d fixed vertex %d\n", vertex_id, vertex_id - 1);
1281 // else
1282 // sprintf(buffer, "vertex %d xyz %e %e %e fixed curve %d\n", vertex_id, crack -> center.x, crack -> center.y, 0.0,
1283 // virtual_curve_id);
1284 // }
1285 // else{
1286 // if(k == 1){
1287 // matrix_crack_ver_id = vertex_id - 1;
1288 //
1289 // if(ellipse -> interface == 0)
1290 // sprintf(buffer, " Vertex %d %d", vertex_id - 1 - vertices, vertex_id - 1);
1291 // else
1292 // sprintf(buffer, " Vertex %d %d Vertex %d %d",
1293 // vertex_id - 1 - vertices, vertex_id - 1 + vertices, vertex_id - 1, vertex_id - 1 + 2 * vertices);
1294 // write_record(ctrl_file, ctrl_file_name, buffer);
1295 //
1296 // /* important: vertex fixed to vertex cannot be used in t3d2merlin;
1297 // parent vertex must be used instead !!! */
1298 // if(ellipse -> interface == 0)
1299 // sprintf(buffer, " Vertex %d %d", vertex_id - vertices, vertex_id - 1);
1300 // else
1301 // sprintf(buffer, " Vertex %d %d Vertex %d %d",
1302 // vertex_id - 1 - vertices, vertex_id + vertices, vertex_id, vertex_id + 2 * vertices);
1303 // write_record(ctrl_file, ctrl_file_name, buffer);
1304 //
1305 // sprintf(buffer, "vertex %d xyz %e %e %e fixed curve %d coincide vertex %d\n", vertex_id,
1306 // crack -> center.x, crack -> center.y, 0.0, virtual_curve_id, vertex_id - 1);
1307 // }
1308 // else{
1309 // if(k == 3)interface_crack_ver_id = vertex_id - 1;
1310 //
1311 // sprintf(buffer, "vertex %d xyz %e %e %e fixed curve %d\n", vertex_id, crack -> center.x, crack -> center.y, 0.0,
1312 // virtual_curve_id);
1313 // }
1314 // }
1315 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1316 //
1317 // curve_id++;
1318 // sprintf(buffer, "curve %d vertex %d %d fixed curve %d\n", curve_id, vertex_id - 4, vertex_id - 1, virtual_curve_id);
1319 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1320 // curve_id++;
1321 // sprintf(buffer, "curve %d vertex %d %d fixed curve %d\n", curve_id, vertex_id, vertex_id - 3, virtual_curve_id);
1322 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1323 //
1324 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1325 //
1326 // if(k == 1){
1327 // if(ellipse -> interface == 0){
1328 // sprintf(buffer, " Curve %d %d Curve %d %d",
1329 // curve_id - 1 - curves, curve_id - 1, curve_id - curves, curve_id);
1330 // write_record(ctrl_file, ctrl_file_name, buffer);
1331 // }
1332 // else{
1333 // sprintf(buffer, " Curve %d %d Curve %d %d",
1334 // curve_id - 1 - curves, curve_id - 1 + curves, curve_id - 1, curve_id - 1+ 2 * curves);
1335 // write_record(ctrl_file, ctrl_file_name, buffer);
1336 //
1337 // sprintf(buffer, " Curve %d %d Curve %d %d",
1338 // curve_id - curves, curve_id + curves, curve_id, curve_id + 2 * curves);
1339 // write_record(ctrl_file, ctrl_file_name, buffer);
1340 // }
1341 // }
1342 // if(k == 2){
1343 // sprintf(buffer, " Curve %d %d", curve_id - 1 + curves, curve_id - 1);
1344 // write_record(ctrl_file, ctrl_file_name, buffer);
1345 // sprintf(buffer, " Curve %d %d", curve_id + curves, curve_id);
1346 // write_record(ctrl_file, ctrl_file_name, buffer);
1347 // }
1348 // #endif
1349 //
1350 // if(k == 0){
1351 // patch_id++;
1352 // if(ellipse -> property == 0)
1353 // sprintf(tmp_buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d", patch_id,
1354 // curve_id, curve_id - 3, curve_id - 2, curve_id - 1);
1355 // else{
1356 // /* sprintf(buffer, "Patch %d\nElemType %d\n", patch_id, ellipse -> property); */
1357 // sprintf(buffer, "Patch %d\nFaceType %d\n", patch_id, ellipse -> property);
1358 // write_record(ctrl_file, ctrl_file_name, buffer);
1359 //
1360 // if(imsz == 0.0){
1361 // default_msz = YES;
1362 // sprintf(buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d size def property %d\n\n", patch_id,
1363 // curve_id, curve_id - 3, curve_id - 2, curve_id - 1, ellipse -> property);
1364 // }
1365 // else
1366 // sprintf(buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d size %e property %d\n\n", patch_id,
1367 // curve_id, curve_id - 3, curve_id - 2, curve_id - 1, imsz, ellipse -> property);
1368 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1369 // }
1370 //
1371 // if(ellipse -> interface == 0){
1372 // if(ellipse -> property == prop || ellipse -> property == 0){
1373 // ellipse -> patch = patch_id;
1374 // break;
1375 // }
1376 // }
1377 // else{
1378 // if(ellipse -> bc != 0){
1379 // bc = YES;
1380 // sprintf(ellipse -> bc_ellipse_spec, "#Curve %d %d %d %d\n",
1381 // curve_id - 3, curve_id - 2, curve_id - 1, curve_id);
1382 // sprintf(ellipse -> bc_matrix_spec, "#Curve %d %d %d %d\n",
1383 // curve_id - 3 + curves, curve_id - 2 + curves, curve_id - 1 + curves, curve_id + curves);
1384 // }
1385 // }
1386 // }
1387 // if(k == 1){
1388 // patch_id++;
1389 // sprintf(tmp_buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d", patch_id,
1390 // curve_id, curve_id - 3, curve_id - 2, curve_id - 1);
1391 // ellipse -> patch = patch_id;
1392 // }
1393 //
1394 // if(k == 1 || k == 2)write_record(ctrl_file, ctrl_file_name, "\n");
1395 //
1396 // if(k == 1 && ellipse -> interface == 0)break;
1397 // }
1398 // }
1399 // else{
1400 //
1401 // /* setup the points that the crack is always in the first quadrant */
1402 // for(i = 0; i < 4; i++){
1403 // g_point[i] = &(glob_point[(quadrant - 1 + i + 4) % 4]);
1404 // g_pnt[i] = &(glob_pnt[(quadrant - 1 + i + 4) % 4]);
1405 // }
1406 //
1407 // vertices = 6;
1408 // curves = 5 + 1; /* one is virtual */
1409 //
1410 // for(k = 0; k < 4; k++){
1411 //
1412 // /* k = 0 inclusion boundary
1413 // k = 1 matrix boundary
1414 // k = 2 inclusion interface
1415 // k = 3 matrix interface */
1416 //
1417 // if(k == 1){
1418 // sprintf(buffer, "MasterSlave");
1419 // write_record(ctrl_file, ctrl_file_name, buffer);
1420 // }
1421 // if(k == 2){
1422 // sprintf(buffer, "Interface %d", ellipse -> interface);
1423 // write_record(ctrl_file, ctrl_file_name, buffer);
1424 // }
1425 //
1426 // for(i = 0; i < 4; i++){
1427 // vertex_id++;
1428 // if(bmsz == 0.0){
1429 // default_msz = YES;
1430 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, g_point[i] -> x, g_point[i] -> y, 0.0);
1431 // }
1432 // else
1433 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, g_point[i] -> x, g_point[i] -> y, 0.0, bmsz);
1434 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1435 //
1436 // if(k == 1){
1437 // if(ellipse -> interface == 0)
1438 // sprintf(buffer, " Vertex %d %d", vertex_id - vertices, vertex_id);
1439 // else
1440 // sprintf(buffer, " Vertex %d %d Vertex %d %d",
1441 // vertex_id - vertices, vertex_id + vertices, vertex_id, vertex_id + 2 * vertices);
1442 // write_record(ctrl_file, ctrl_file_name, buffer);
1443 // }
1444 // }
1445 //
1446 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1447 //
1448 // for(i = 0; i < 4; i++){
1449 // ver_id1 = vertex_id - 3 + i;
1450 // ver_id2 = ver_id1 + 1;
1451 // if(i == 3)ver_id2 -= 4;
1452 //
1453 // curve_id++;
1454 // if(i == 0){
1455 //
1456 // /* make virtual curve over the first quadrant */
1457 // sprintf(buffer, "curve %d virtual order 3 vertex %d %d\n", curve_id, ver_id1, ver_id2);
1458 // virtual_curve_id = curve_id;
1459 // }
1460 // else{
1461 // if(k == 1){
1462 // if(ellipse -> interface == 0)
1463 // sprintf(buffer, " Curve %d %d",
1464 // curve_id - curves, curve_id);
1465 // else
1466 // sprintf(buffer, " Curve %d %d Curve %d %d",
1467 // curve_id - curves, curve_id + curves, curve_id, curve_id + 2 * curves);
1468 // write_record(ctrl_file, ctrl_file_name, buffer);
1469 // }
1470 // if(k == 2){
1471 // sprintf(buffer, " Curve %d %d", curve_id + curves, curve_id);
1472 // write_record(ctrl_file, ctrl_file_name, buffer);
1473 // }
1474 //
1475 // sprintf(buffer, "curve %d order 3 vertex %d %d\n", curve_id, ver_id1, ver_id2);
1476 // }
1477 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1478 //
1479 // if(bmsz == 0.0){
1480 // default_msz = YES;
1481 // sprintf(buffer, "polygon 1 xyz %e %e %e weight %e\n", g_pnt[i] -> x, g_pnt[i] -> y, 0.0, weight_q);
1482 // }
1483 // else
1484 // sprintf(buffer, "polygon 1 xyz %e %e %e weight %e size %e\n", g_pnt[i] -> x, g_pnt[i] -> y, 0.0, weight_q, bmsz);
1485 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1486 // }
1487 //
1488 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1489 //
1490 // /* split virtual curve */
1491 // vertex_id++;
1492 // sprintf(buffer, "vertex %d xyz %e %e %e fixed curve %d\n", vertex_id, crack -> center.x, crack -> center.y, 0.0,
1493 // virtual_curve_id);
1494 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1495 //
1496 // if(k == 0 || k == 1){
1497 // matrix_crack_ver_id = vertex_id;
1498 // interface_crack_ver_id = 0;
1499 // }
1500 // if(k == 3)interface_crack_ver_id = vertex_id;
1501 //
1502 // if(k == 1){
1503 // if(ellipse -> interface == 0)
1504 // sprintf(buffer, " Vertex %d %d", vertex_id - vertices, vertex_id);
1505 // else
1506 // sprintf(buffer, " Vertex %d %d Vertex %d %d",
1507 // vertex_id - vertices, vertex_id + vertices, vertex_id, vertex_id + 2 * vertices);
1508 // write_record(ctrl_file, ctrl_file_name, buffer);
1509 // }
1510 //
1511 // vertex_id++;
1512 // if(k == 1 || k == 3 || ellipse -> property == 0){
1513 // sprintf(buffer, "vertex %d xyz %e %e %e fixed curve %d\n", vertex_id, crack -> center.x, crack -> center.y, 0.0,
1514 // virtual_curve_id);
1515 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1516 //
1517 // if(k == 1){
1518 // if(ellipse -> interface == 0)
1519 // sprintf(buffer, " Vertex %d %d", vertex_id - 1 - vertices, vertex_id);
1520 // else{
1521 // if(ellipse -> property == 0)
1522 // sprintf(buffer, " Vertex %d %d Vertex %d %d",
1523 // vertex_id - vertices, vertex_id + vertices, vertex_id, vertex_id + 2 * vertices);
1524 // else
1525 // sprintf(buffer, " Vertex %d %d",
1526 // vertex_id, vertex_id + 2 * vertices);
1527 // }
1528 // write_record(ctrl_file, ctrl_file_name, buffer);
1529 // }
1530 // }
1531 //
1532 // curve_id++;
1533 // sprintf(buffer, "curve %d vertex %d %d fixed curve %d\n", curve_id, vertex_id - 5, vertex_id - 1, virtual_curve_id);
1534 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1535 //
1536 // curve_id++;
1537 // if(k == 1 || k == 3 || ellipse -> property == 0)
1538 // sprintf(buffer, "curve %d vertex %d %d fixed curve %d\n", curve_id, vertex_id, vertex_id - 4, virtual_curve_id);
1539 // else
1540 // sprintf(buffer, "curve %d vertex %d %d fixed curve %d\n", curve_id, vertex_id - 1, vertex_id - 4, virtual_curve_id);
1541 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1542 //
1543 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1544 //
1545 // if(k == 1){
1546 // if(ellipse -> interface == 0){
1547 // sprintf(buffer, " Curve %d %d Curve %d %d",
1548 // curve_id - 1 - curves, curve_id - 1, curve_id - curves, curve_id);
1549 // write_record(ctrl_file, ctrl_file_name, buffer);
1550 // }
1551 // else{
1552 // sprintf(buffer, " Curve %d %d Curve %d %d",
1553 // curve_id - 1 - curves, curve_id - 1 + curves, curve_id - 1, curve_id - 1 + 2 * curves);
1554 // write_record(ctrl_file, ctrl_file_name, buffer);
1555 //
1556 // sprintf(buffer, " Curve %d %d Curve %d %d",
1557 // curve_id - curves, curve_id + curves, curve_id, curve_id + 2 * curves);
1558 // write_record(ctrl_file, ctrl_file_name, buffer);
1559 // }
1560 // }
1561 // if(k == 2){
1562 // sprintf(buffer, " Curve %d %d", curve_id - 1 + curves, curve_id - 1);
1563 // write_record(ctrl_file, ctrl_file_name, buffer);
1564 // sprintf(buffer, " Curve %d %d", curve_id + curves, curve_id);
1565 // write_record(ctrl_file, ctrl_file_name, buffer);
1566 // }
1567 //
1568 // #ifdef HUHU
1569 // vertex_id++;
1570 // sprintf(buffer, "vertex %d xyz %e %e %e fixed curve %d\n", vertex_id, crack -> center.x, crack -> center.y, 0.0,
1571 // virtual_curve_id);
1572 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1573 //
1574 // vertex_id++;
1575 // if(k == 0){
1576 // matrix_crack_ver_id = vertex_id - 1;
1577 // interface_crack_ver_id = 0;
1578 //
1579 // if(ellipse -> property != 0)
1580 // sprintf(buffer, "vertex %d fixed vertex %d\n", vertex_id, vertex_id - 1);
1581 // else
1582 // sprintf(buffer, "vertex %d xyz %e %e %e fixed curve %d\n", vertex_id, crack -> center.x, crack -> center.y, 0.0,
1583 // virtual_curve_id);
1584 // }
1585 // else{
1586 // if(k == 1){
1587 // matrix_crack_ver_id = vertex_id - 1;
1588 //
1589 // if(ellipse -> interface == 0)
1590 // sprintf(buffer, " Vertex %d %d", vertex_id - 1 - vertices, vertex_id - 1);
1591 // else
1592 // sprintf(buffer, " Vertex %d %d Vertex %d %d",
1593 // vertex_id - 1 - vertices, vertex_id - 1 + vertices, vertex_id - 1, vertex_id - 1 + 2 * vertices);
1594 // write_record(ctrl_file, ctrl_file_name, buffer);
1595 //
1596 // /* important: vertex fixed to vertex cannot be used in t3d2merlin;
1597 // parent vertex must be used instead !!! */
1598 // if(ellipse -> interface == 0)
1599 // sprintf(buffer, " Vertex %d %d", vertex_id - vertices, vertex_id - 1);
1600 // else
1601 // sprintf(buffer, " Vertex %d %d Vertex %d %d",
1602 // vertex_id - 1 - vertices, vertex_id + vertices, vertex_id, vertex_id + 2 * vertices);
1603 // write_record(ctrl_file, ctrl_file_name, buffer);
1604 //
1605 // sprintf(buffer, "vertex %d xyz %e %e %e fixed curve %d coincide vertex %d\n", vertex_id,
1606 // crack -> center.x, crack -> center.y, 0.0, virtual_curve_id, vertex_id - 1);
1607 // }
1608 // else{
1609 // if(k == 3)interface_crack_ver_id = vertex_id - 1;
1610 //
1611 // sprintf(buffer, "vertex %d xyz %e %e %e fixed curve %d\n", vertex_id,
1612 // crack -> center.x, crack -> center.y, 0.0, virtual_curve_id);
1613 // }
1614 // }
1615 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1616 //
1617 // curve_id++;
1618 // sprintf(buffer, "curve %d vertex %d %d fixed curve %d\n", curve_id, vertex_id - 5, vertex_id - 1, virtual_curve_id);
1619 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1620 // curve_id++;
1621 // sprintf(buffer, "curve %d vertex %d %d fixed curve %d\n", curve_id, vertex_id, vertex_id - 4, virtual_curve_id);
1622 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1623 //
1624 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1625 //
1626 // if(k == 1){
1627 // if(ellipse -> interface == 0){
1628 // sprintf(buffer, " Curve %d %d Curve %d %d",
1629 // curve_id - 1 - curves, curve_id - 1, curve_id - curves, curve_id);
1630 // write_record(ctrl_file, ctrl_file_name, buffer);
1631 // }
1632 // else{
1633 // sprintf(buffer, " Curve %d %d Curve %d %d",
1634 // curve_id - 1 - curves, curve_id - 1 + curves, curve_id - 1, curve_id - 1+ 2 * curves);
1635 // write_record(ctrl_file, ctrl_file_name, buffer);
1636 // sprintf(buffer, " Curve %d %d Curve %d %d",
1637 // curve_id - curves, curve_id + curves, curve_id, curve_id + 2 * curves);
1638 // write_record(ctrl_file, ctrl_file_name, buffer);
1639 // }
1640 // }
1641 // if(k == 2){
1642 // sprintf(buffer, " Curve %d %d", curve_id - 1 + curves, curve_id - 1);
1643 // write_record(ctrl_file, ctrl_file_name, buffer);
1644 // sprintf(buffer, " Curve %d %d", curve_id + curves, curve_id);
1645 // write_record(ctrl_file, ctrl_file_name, buffer);
1646 // }
1647 // #endif
1648 //
1649 // if(k == 0){
1650 // patch_id++;
1651 // if(ellipse -> property == 0)
1652 // sprintf(tmp_buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d %d", patch_id,
1653 // curve_id, curve_id - 4, curve_id - 3, curve_id - 2, curve_id - 1);
1654 // else{
1655 // /* sprintf(buffer, "Patch %d\nElemType %d\n", patch_id, ellipse -> property); */
1656 // sprintf(buffer, "Patch %d\nFaceType %d\n", patch_id, ellipse -> property);
1657 // write_record(ctrl_file, ctrl_file_name, buffer);
1658 //
1659 // if(imsz == 0)
1660 // sprintf(buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d %d size def property %d\n\n", patch_id,
1661 // curve_id, curve_id - 4, curve_id - 3, curve_id - 2, curve_id - 1, ellipse -> property);
1662 // else
1663 // sprintf(buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d %d size %e property %d\n\n", patch_id,
1664 // curve_id, curve_id - 4, curve_id - 3, curve_id - 2, curve_id - 1, imsz, ellipse -> property);
1665 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1666 // }
1667 //
1668 // if(ellipse -> interface == 0){
1669 // if(ellipse -> property == prop || ellipse -> property == 0){
1670 // ellipse -> patch = patch_id;
1671 // break;
1672 // }
1673 // }
1674 // else{
1675 // if(ellipse -> bc != 0){
1676 // bc = YES;
1677 // sprintf(ellipse -> bc_ellipse_spec, "#Curve %d %d %d %d %d\n",
1678 // curve_id - 4, curve_id - 3, curve_id - 2, curve_id - 1, curve_id);
1679 // sprintf(ellipse -> bc_matrix_spec, "#Curve %d %d %d %d %d\n",
1680 // curve_id - 4 + curves, curve_id - 3 + curves, curve_id - 2 + curves, curve_id - 1 + curves, curve_id + curves);
1681 // }
1682 // }
1683 // }
1684 // if(k == 1){
1685 // patch_id++;
1686 // sprintf(tmp_buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d %d", patch_id,
1687 // curve_id, curve_id - 4, curve_id - 3, curve_id - 2, curve_id - 1);
1688 // ellipse -> patch = patch_id;
1689 // }
1690 //
1691 // if(k == 1 || k == 2)write_record(ctrl_file, ctrl_file_name, "\n");
1692 //
1693 // if(k == 1 && ellipse -> interface == 0)break;
1694 // }
1695 // }
1696 //
1697 // /* make crack */
1698 // if(ellipse -> interface == 0){
1699 //
1700 // /* make new matrix crack vertices because the original ones have got a weight != 1.0,
1701 // while the interface vertices (to be created later because interface_crack_ver_id == 0) will have weight == 1.0;
1702 // this may cause non-compatible meshes on master/slave curves */
1703 // vertex_id++;
1704 // sprintf(buffer, "vertex %d fixed vertex %d weight 1.0\n", vertex_id, matrix_crack_ver_id);
1705 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1706 // vertex_id++;
1707 // if(ellipse -> property != prop)
1708 // sprintf(buffer, "vertex %d fixed vertex %d weight 1.0\n", vertex_id, matrix_crack_ver_id + 1);
1709 // else
1710 // sprintf(buffer, "vertex %d fixed vertex %d weight 1.0\n", vertex_id, matrix_crack_ver_id);
1711 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1712 //
1713 // orig_matrix_crack_ver_id = matrix_crack_ver_id;
1714 // matrix_crack_ver_id = vertex_id - 1;
1715 // }
1716 //
1717 // vertex_id++;
1718 // if(cmsz == 0.0){
1719 // default_msz = YES;
1720 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, crack -> tip.x, crack -> tip.y, 0.0);
1721 // }
1722 // else
1723 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, crack -> tip.x, crack -> tip.y, 0.0, cmsz);
1724 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1725 // tip_crack_ver_id = vertex_id;
1726 //
1727 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1728 //
1729 // /* note: cracksurface, interface and master/slave curves must be of the same orientation;
1730 // to enable contourpath, the curves must go from tip to center !!! */
1731 // curve_id++;
1732 // if(cmsz == 0.0)
1733 // sprintf(buffer, "curve %d vertex %d %d\n", curve_id, vertex_id, matrix_crack_ver_id);
1734 // else
1735 // sprintf(buffer, "curve %d vertex %d %d size %e\n", curve_id, vertex_id, matrix_crack_ver_id, cmsz);
1736 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1737 //
1738 // crack_cur_id = curve_id;
1739 //
1740 // curve_id++;
1741 // if(cmsz == 0.0)
1742 // sprintf(buffer, "curve %d vertex %d %d coincide curve %d\n", curve_id, vertex_id, matrix_crack_ver_id + 1, curve_id - 1);
1743 // else
1744 // sprintf(buffer, "curve %d vertex %d %d coincide curve %d size %e\n", curve_id, vertex_id, matrix_crack_ver_id + 1,
1745 // curve_id - 1, cmsz);
1746 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1747 //
1748 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1749 //
1750 // /* make crack interface */
1751 // if(crack -> interface != 0){
1752 // if(ellipse -> interface == 0){
1753 // vertex_id++;
1754 // if(cmsz == 0.0){
1755 // default_msz = YES;
1756 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, crack -> center.x, crack -> center.y, 0.0);
1757 // }
1758 // else
1759 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, crack -> center.x, crack -> center.y, 0.0, cmsz);
1760 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1761 //
1762 // vertex_id++;
1763 // if(cmsz == 0.0){
1764 // default_msz = YES;
1765 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, crack -> center.x, crack -> center.y, 0.0);
1766 // }
1767 // else
1768 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, crack -> center.x, crack -> center.y, 0.0, cmsz);
1769 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1770 //
1771 // interface_crack_ver_id = vertex_id - 1;
1772 // }
1773 //
1774 // vertex_id++;
1775 // if(cmsz == 0.0){
1776 // default_msz = YES;
1777 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, crack -> tip.x, crack -> tip.y, 0.0);
1778 // }
1779 // else
1780 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, crack -> tip.x, crack -> tip.y, 0.0, cmsz);
1781 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1782 //
1783 // vertex_id++;
1784 // if(cmsz == 0.0){
1785 // default_msz = YES;
1786 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, crack -> tip.x, crack -> tip.y, 0.0);
1787 // }
1788 // else
1789 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, crack -> tip.x, crack -> tip.y, 0.0, cmsz);
1790 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1791 //
1792 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1793 //
1794 // /* note: cracksurface, interface and master/slave curves must be of the same orientation;
1795 // to enable contourpath, the curves must go from tip to center !!! */
1796 // curve_id++;
1797 // if(cmsz == 0.0)
1798 // sprintf(buffer, "curve %d vertex %d %d\n", curve_id, vertex_id - 1, interface_crack_ver_id);
1799 // else
1800 // sprintf(buffer, "curve %d vertex %d %d size %e\n", curve_id, vertex_id - 1, interface_crack_ver_id, cmsz);
1801 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1802 //
1803 // curve_id++;
1804 // if(cmsz == 0.0)
1805 // sprintf(buffer, "curve %d vertex %d %d\n", curve_id, vertex_id, interface_crack_ver_id + 1);
1806 // else
1807 // sprintf(buffer, "curve %d vertex %d %d size %e\n", curve_id, vertex_id, interface_crack_ver_id + 1, cmsz);
1808 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1809 //
1810 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1811 //
1812 // if(ellipse -> interface == 0){
1813 //
1814 // /* important: vertex fixed to vertex cannot be used in t3d2merlin;
1815 // parent vertex must be used instead !!! */
1816 // if(ellipse -> property != 0){
1817 // if(ellipse -> property != prop)
1818 // sprintf(buffer, "MasterSlave Vertex %d %d Vertex %d %d Vertex %d %d Vertex %d %d Curve %d %d Curve %d %d\n",
1819 // tip_crack_ver_id, vertex_id, tip_crack_ver_id, vertex_id - 1,
1820 // orig_matrix_crack_ver_id - vertices, interface_crack_ver_id,
1821 // orig_matrix_crack_ver_id - vertices, interface_crack_ver_id + 1,
1822 // curve_id - 3, curve_id - 1, curve_id - 2, curve_id);
1823 // else
1824 // sprintf(buffer, "MasterSlave Vertex %d %d Vertex %d %d Vertex %d %d Vertex %d %d Curve %d %d Curve %d %d\n",
1825 // tip_crack_ver_id, vertex_id, tip_crack_ver_id, vertex_id - 1,
1826 // orig_matrix_crack_ver_id, interface_crack_ver_id, orig_matrix_crack_ver_id, interface_crack_ver_id + 1,
1827 // curve_id - 3, curve_id - 1, curve_id - 2, curve_id);
1828 // }
1829 // else
1830 // sprintf(buffer, "MasterSlave Vertex %d %d Vertex %d %d Vertex %d %d Vertex %d %d Curve %d %d Curve %d %d\n",
1831 // tip_crack_ver_id, vertex_id, tip_crack_ver_id, vertex_id - 1,
1832 // orig_matrix_crack_ver_id, interface_crack_ver_id, orig_matrix_crack_ver_id + 1, interface_crack_ver_id + 1,
1833 // curve_id - 3, curve_id - 1, curve_id - 2, curve_id);
1834 // }
1835 // else
1836 // sprintf(buffer, "MasterSlave Vertex %d %d Vertex %d %d Curve %d %d Curve %d %d\n",
1837 // tip_crack_ver_id, vertex_id, tip_crack_ver_id, vertex_id - 1,
1838 // curve_id - 3, curve_id - 1, curve_id - 2, curve_id);
1839 // write_record(ctrl_file, ctrl_file_name, buffer);
1840 // sprintf(buffer, "Interface %d Curve %d %d\n", crack -> interface, curve_id, curve_id - 1);
1841 // write_record(ctrl_file, ctrl_file_name, buffer);
1842 // }
1843 //
1844 // crack_id++;
1845 // sprintf(buffer, "CrackSurface %d Curve %d %d\n", crack_id, crack_cur_id, crack_cur_id + 1);
1846 // write_record(ctrl_file, ctrl_file_name, buffer);
1847 // sprintf(buffer, "Vertex %d\nCrackFronts %d\n", tip_crack_ver_id, crack_id);
1848 // write_record(ctrl_file, ctrl_file_name, buffer);
1849 //
1850 // if(crack -> bc != 0){
1851 // bc = YES;
1852 // sprintf(crack -> bc_spec, "#Curve %d %d\n", crack_cur_id, crack_cur_id + 1);
1853 // }
1854 //
1855 // if(crack -> radius != 0.0){
1856 // sprintf(buffer, "Contourpath %d Radius %e\n", crack_id, crack -> radius);
1857 // write_record(ctrl_file, ctrl_file_name, buffer);
1858 // }
1859 //
1860 // if(tmsz != 0.0){
1861 // vertex_id++;
1862 // sprintf(buffer, "vertex %d virtual fixed vertex %d size %e\n", vertex_id, tip_crack_ver_id, tmsz);
1863 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1864 //
1865 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1866 // }
1867 //
1868 // if(ellipse -> property == 0 || ellipse -> interface != 0 || ellipse -> property != prop){
1869 // sprintf(buffer, "%s %d %d hole\n\n", tmp_buffer, -crack_cur_id, crack_cur_id + 1);
1870 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1871 // }
1872 // else
1873 // crack -> curve = crack_cur_id;
1874 // }
1875 // else{
1876 // strcat(buffer, "\n\n");
1877 //
1878 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1879 // write_record(ctrl_file, ctrl_file_name, buffer);
1880 //
1881 // vertices = 4;
1882 // curves = 4;
1883 //
1884 // for(k = 0; k < 4; k++){
1885 //
1886 // /* k = 0 inclusion boundary
1887 // k = 1 matrix boundary
1888 // k = 2 inclusion interface
1889 // k = 3 matrix interface */
1890 //
1891 // if(k == 1){
1892 // sprintf(buffer, "MasterSlave");
1893 // write_record(ctrl_file, ctrl_file_name, buffer);
1894 // }
1895 // if(k == 2){
1896 // sprintf(buffer, "Interface %d", ellipse -> interface);
1897 // write_record(ctrl_file, ctrl_file_name, buffer);
1898 // }
1899 //
1900 // for(i = 0; i < 4; i++){
1901 // vertex_id++;
1902 // if(bmsz == 0.0){
1903 // default_msz = YES;
1904 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, glob_point[i].x, glob_point[i].y, 0.0);
1905 // }
1906 // else
1907 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, glob_point[i].x, glob_point[i].y, 0.0, bmsz);
1908 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1909 //
1910 // if(k == 1){
1911 // if(ellipse -> interface == 0)
1912 // sprintf(buffer, " Vertex %d %d", vertex_id - vertices, vertex_id);
1913 // else
1914 // sprintf(buffer, " Vertex %d %d Vertex %d %d",
1915 // vertex_id - vertices, vertex_id + vertices, vertex_id, vertex_id + 2 * vertices);
1916 // write_record(ctrl_file, ctrl_file_name, buffer);
1917 // }
1918 // }
1919 //
1920 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1921 //
1922 // for(i = 0; i < 4; i++){
1923 // ver_id1 = vertex_id - 3 + i;
1924 // ver_id2 = ver_id1 + 1;
1925 // if(i == 3)ver_id2 -= 4;
1926 //
1927 // curve_id++;
1928 // sprintf(buffer, "curve %d order 3 vertex %d %d\n", curve_id, ver_id1, ver_id2);
1929 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1930 //
1931 // if(bmsz == 0.0){
1932 // default_msz = YES;
1933 // sprintf(buffer, "polygon 1 xyz %e %e %e weight %e\n", glob_pnt[i].x, glob_pnt[i].y, 0.0, weight_q);
1934 // }
1935 // else
1936 // sprintf(buffer, "polygon 1 xyz %e %e %e weight %e size %e\n", glob_pnt[i].x, glob_pnt[i].y, 0.0, weight_q, bmsz);
1937 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1938 //
1939 // if(k == 1){
1940 // if(ellipse -> interface == 0)
1941 // sprintf(buffer, " Curve %d %d", curve_id - curves, curve_id);
1942 // else
1943 // sprintf(buffer, " Curve %d %d Curve %d %d",
1944 // curve_id - curves, curve_id + curves, curve_id, curve_id + 2 * curves);
1945 // write_record(ctrl_file, ctrl_file_name, buffer);
1946 // }
1947 // if(k == 2){
1948 // sprintf(buffer, " Curve %d %d", curve_id + curves, curve_id);
1949 // write_record(ctrl_file, ctrl_file_name, buffer);
1950 // }
1951 // }
1952 //
1953 // write_record(t3d_in_file, t3d_in_file_name, "\n");
1954 //
1955 // if(k == 0){
1956 // patch_id++;
1957 // if(ellipse -> property == 0)
1958 // sprintf(buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d hole\n\n", patch_id,
1959 // curve_id - 3, curve_id - 2, curve_id - 1, curve_id);
1960 // else{
1961 // /* sprintf(buffer, "Patch %d\nElemType %d\n", patch_id, ellipse -> property); */
1962 // sprintf(buffer, "Patch %d\nFaceType %d\n", patch_id, ellipse -> property);
1963 // write_record(ctrl_file, ctrl_file_name, buffer);
1964 //
1965 // if(imsz == 0.0){
1966 // default_msz = YES;
1967 // sprintf(buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d size def property %d\n\n", patch_id,
1968 // curve_id - 3, curve_id - 2, curve_id - 1, curve_id, ellipse -> property);
1969 // }
1970 // else
1971 // sprintf(buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d size %e property %d\n\n", patch_id,
1972 // curve_id - 3, curve_id - 2, curve_id - 1, curve_id, imsz, ellipse -> property);
1973 // }
1974 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1975 //
1976 // if(ellipse -> interface == 0){
1977 // if(ellipse -> property == prop || ellipse -> property == 0){
1978 // ellipse -> patch = patch_id;
1979 // break;
1980 // }
1981 // }
1982 // else{
1983 // if(ellipse -> bc != 0){
1984 // bc = YES;
1985 // sprintf(ellipse -> bc_ellipse_spec, "#Curve %d %d %d %d\n",
1986 // curve_id - 3, curve_id - 2, curve_id - 1, curve_id);
1987 // sprintf(ellipse -> bc_matrix_spec, "#Curve %d %d %d %d\n",
1988 // curve_id - 3 + curves, curve_id - 2 + curves, curve_id - 1 + curves, curve_id + curves);
1989 // }
1990 // }
1991 // }
1992 // if(k == 1){
1993 // patch_id++;
1994 // sprintf(buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d hole\n\n", patch_id,
1995 // curve_id - 3, curve_id - 2, curve_id - 1, curve_id);
1996 // write_record(t3d_in_file, t3d_in_file_name, buffer);
1997 // ellipse -> patch = patch_id;
1998 // }
1999 //
2000 // if(k == 1 || k == 2)write_record(ctrl_file, ctrl_file_name, "\n");
2001 //
2002 // if(k == 1 && ellipse -> interface == 0)break;
2003 // }
2004 // }
2005 // }
2006 //
2007 //
2008 //
2009 // static void
2010 // write_crack(crack_rec *crack)
2011 // {
2012 // point_rec mid_pnt;
2013 // double cmsz, tmsz;
2014 // int i, tip_crack_ver_id1, tip_crack_ver_id2, mid_crack_ver_id1, mid_crack_ver_id2, crack_cur_id1, crack_cur_id2;
2015 // char buffer[1024];
2016 //
2017 // if(crack -> id < 0)return;
2018 // if(crack -> ellipse != NULL)return;
2019 //
2020 // if(crack -> interface == 0)
2021 // sprintf(buffer, "\n# crack no %d\n\n", crack -> id);
2022 // else
2023 // sprintf(buffer, "\n# crack no %d (interface %d)\n\n", crack -> id, crack -> interface);
2024 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2025 // write_record(ctrl_file, ctrl_file_name, buffer);
2026 //
2027 // cmsz = crack -> crack_msz;
2028 // tmsz = crack -> tip_msz;
2029 //
2030 // /* note: separate crack is modelled as two cracks (oriented from tip to mid_pnt) */
2031 //
2032 // aver_point(mid_pnt, crack -> center, crack -> tip);
2033 //
2034 // /* make crack */
2035 // vertex_id++;
2036 // if(cmsz == 0.0){
2037 // default_msz = YES;
2038 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, crack -> center.x, crack -> center.y, 0.0);
2039 // }
2040 // else
2041 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, crack -> center.x, crack -> center.y, 0.0, cmsz);
2042 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2043 // tip_crack_ver_id1 = vertex_id;
2044 //
2045 // vertex_id++;
2046 // if(cmsz == 0.0){
2047 // default_msz = YES;
2048 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, crack -> tip.x, crack -> tip.y, 0.0);
2049 // }
2050 // else
2051 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, crack -> tip.x, crack -> tip.y, 0.0, cmsz);
2052 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2053 // tip_crack_ver_id2 = vertex_id;
2054 //
2055 // write_record(t3d_in_file, t3d_in_file_name, "\n");
2056 //
2057 // vertex_id++;
2058 // if(cmsz == 0.0){
2059 // default_msz = YES;
2060 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, mid_pnt.x, mid_pnt.y, 0.0);
2061 // }
2062 // else
2063 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, mid_pnt.x, mid_pnt.y, 0.0, cmsz);
2064 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2065 // mid_crack_ver_id1 = vertex_id;
2066 //
2067 // vertex_id++;
2068 // if(cmsz == 0.0){
2069 // default_msz = YES;
2070 // sprintf(buffer, "vertex %d xyz %e %e %e coincide vertex %d\n", vertex_id, mid_pnt.x, mid_pnt.y, 0.0, vertex_id - 1);
2071 // }
2072 // else
2073 // sprintf(buffer, "vertex %d xyz %e %e %e coincide vertex %d size %e\n", vertex_id, mid_pnt.x, mid_pnt.y, 0.0,
2074 // vertex_id - 1, cmsz);
2075 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2076 // mid_crack_ver_id2 = vertex_id;
2077 //
2078 // write_record(t3d_in_file, t3d_in_file_name, "\n");
2079 //
2080 // /* make crack interface */
2081 // if(crack -> interface != 0){
2082 // for(i = 0; i < 2; i++){
2083 // vertex_id++;
2084 // if(cmsz == 0.0){
2085 // default_msz = YES;
2086 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, crack -> center.x, crack -> center.y, 0.0);
2087 // }
2088 // else
2089 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, crack -> center.x, crack -> center.y, 0.0, cmsz);
2090 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2091 // }
2092 //
2093 // for(i = 0; i < 2; i++){
2094 // vertex_id++;
2095 // if(cmsz == 0.0){
2096 // default_msz = YES;
2097 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, crack -> tip.x, crack -> tip.y, 0.0);
2098 // }
2099 // else
2100 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, crack -> tip.x, crack -> tip.y, 0.0, cmsz);
2101 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2102 // }
2103 //
2104 // write_record(t3d_in_file, t3d_in_file_name, "\n");
2105 //
2106 // for(i = 0; i < 2; i++){
2107 // vertex_id++;
2108 // if(cmsz == 0.0){
2109 // default_msz = YES;
2110 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, mid_pnt.x, mid_pnt.y, 0.0);
2111 // }
2112 // else
2113 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, mid_pnt.x, mid_pnt.y, 0.0, cmsz);
2114 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2115 // }
2116 //
2117 // write_record(t3d_in_file, t3d_in_file_name, "\n");
2118 // }
2119 //
2120 // /* make crack */
2121 // /* note: cracksurface, interface and master/slave curves must be of the same orientation (from tip to mid_pnt) */
2122 // curve_id++;
2123 // if(cmsz == 0.0)
2124 // sprintf(buffer, "curve %d vertex %d %d\n", curve_id, tip_crack_ver_id1, mid_crack_ver_id1);
2125 // else
2126 // sprintf(buffer, "curve %d vertex %d %d size %e\n", curve_id, tip_crack_ver_id1, mid_crack_ver_id1, cmsz);
2127 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2128 //
2129 // crack_cur_id1 = curve_id;
2130 //
2131 // curve_id++;
2132 // if(cmsz == 0.0)
2133 // sprintf(buffer, "curve %d vertex %d %d coincide curve %d\n", curve_id, tip_crack_ver_id1, mid_crack_ver_id2, curve_id - 1);
2134 // else
2135 // sprintf(buffer, "curve %d vertex %d %d coincide curve %d size %e\n", curve_id, tip_crack_ver_id1, mid_crack_ver_id2,
2136 // curve_id - 1, cmsz);
2137 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2138 //
2139 // curve_id++;
2140 // if(cmsz == 0.0)
2141 // sprintf(buffer, "curve %d vertex %d %d\n", curve_id, tip_crack_ver_id2, mid_crack_ver_id1);
2142 // else
2143 // sprintf(buffer, "curve %d vertex %d %d size %e\n", curve_id, tip_crack_ver_id2, mid_crack_ver_id1, cmsz);
2144 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2145 //
2146 // crack_cur_id2 = curve_id;
2147 //
2148 // curve_id++;
2149 // if(cmsz == 0.0)
2150 // sprintf(buffer, "curve %d vertex %d %d coincide curve %d\n", curve_id, tip_crack_ver_id2, mid_crack_ver_id2, curve_id - 1);
2151 // else
2152 // sprintf(buffer, "curve %d vertex %d %d coincide curve %d size %e\n", curve_id, tip_crack_ver_id2, mid_crack_ver_id2,
2153 // curve_id - 1, cmsz);
2154 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2155 //
2156 // write_record(t3d_in_file, t3d_in_file_name, "\n");
2157 //
2158 // /* make crack interface */
2159 // /* note: cracksurface, interface and master/slave curves must be of the same orientation (from tip to mid_pnt) */
2160 // if(crack -> interface != 0){
2161 // for(i = 0; i < 2; i++){
2162 // curve_id++;
2163 // if(cmsz == 0.0)
2164 // sprintf(buffer, "curve %d vertex %d %d\n", curve_id, vertex_id - 5 + i, vertex_id - 1 + i);
2165 // else
2166 // sprintf(buffer, "curve %d vertex %d %d size %e\n", curve_id, vertex_id - 5 + i, vertex_id - 1 + i, cmsz);
2167 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2168 // }
2169 // for(i = 0; i < 2; i++){
2170 // curve_id++;
2171 // if(cmsz == 0.0)
2172 // sprintf(buffer, "curve %d vertex %d %d\n", curve_id, vertex_id - 3 + i, vertex_id - 1 + i);
2173 // else
2174 // sprintf(buffer, "curve %d vertex %d %d size %e\n", curve_id, vertex_id - 3 + i, vertex_id - 1 + i, cmsz);
2175 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2176 // }
2177 //
2178 // sprintf(buffer, "MasterSlave Vertex %d %d Vertex %d %d Vertex %d %d Vertex %d %d Vertex %d %d Vertex %d %d",
2179 // tip_crack_ver_id1, vertex_id - 5, tip_crack_ver_id1, vertex_id - 4,
2180 // tip_crack_ver_id2, vertex_id - 3, tip_crack_ver_id2, vertex_id - 2,
2181 // mid_crack_ver_id1, vertex_id - 1, mid_crack_ver_id2, vertex_id);
2182 // write_record(ctrl_file, ctrl_file_name, buffer);
2183 // sprintf(buffer, " Curve %d %d Curve %d %d Curve %d %d Curve %d %d\n",
2184 // curve_id - 7, curve_id - 3, curve_id - 6, curve_id - 2,
2185 // curve_id - 5, curve_id - 1, curve_id - 4, curve_id);
2186 // write_record(ctrl_file, ctrl_file_name, buffer);
2187 // sprintf(buffer, "Interface %d Curve %d %d Curve %d %d\n", crack -> interface, curve_id - 3, curve_id - 2,
2188 // curve_id, curve_id - 1);
2189 // write_record(ctrl_file, ctrl_file_name, buffer);
2190 // }
2191 //
2192 // crack_id++;
2193 // sprintf(buffer, "CrackSurface %d Curve %d %d\n", crack_id, crack_cur_id1, crack_cur_id1 + 1);
2194 // write_record(ctrl_file, ctrl_file_name, buffer);
2195 // sprintf(buffer, "Vertex %d\nCrackFronts %d\n", tip_crack_ver_id1, crack_id);
2196 // write_record(ctrl_file, ctrl_file_name, buffer);
2197 // sprintf(buffer, "Contourpath %d Radius %e\n", crack_id, crack -> radius);
2198 // write_record(ctrl_file, ctrl_file_name, buffer);
2199 //
2200 // crack_id++;
2201 // sprintf(buffer, "CrackSurface %d Curve %d %d\n", crack_id, crack_cur_id2, crack_cur_id2 + 1);
2202 // write_record(ctrl_file, ctrl_file_name, buffer);
2203 // sprintf(buffer, "Vertex %d\nCrackFronts %d\n", tip_crack_ver_id2, crack_id);
2204 // write_record(ctrl_file, ctrl_file_name, buffer);
2205 // sprintf(buffer, "Contourpath %d Radius %e\n", crack_id, crack -> radius);
2206 // write_record(ctrl_file, ctrl_file_name, buffer);
2207 //
2208 // if(crack -> bc != 0){
2209 // bc = YES;
2210 // sprintf(crack -> bc_spec, "#Curve %d %d %d %d\n", crack_cur_id1, crack_cur_id1 + 1, crack_cur_id2, crack_cur_id2 + 1);
2211 // }
2212 //
2213 // if(tmsz != 0.0){
2214 // vertex_id++;
2215 // sprintf(buffer, "vertex %d virtual fixed vertex %d size %e\n", vertex_id, tip_crack_ver_id1, tmsz);
2216 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2217 // vertex_id++;
2218 // sprintf(buffer, "vertex %d virtual fixed vertex %d size %e\n", vertex_id, tip_crack_ver_id2, tmsz);
2219 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2220 //
2221 // write_record(t3d_in_file, t3d_in_file_name, "\n");
2222 // }
2223 //
2224 // crack -> curve = crack_cur_id1;
2225 // }
2226 //
2227 //
2228 //
2229 // static void
2230 // write_cylinder(cylinder_rec *cylinder, ellipse_rec *ellipse_array, crack_rec *crack_array, int ellipses, int cracks)
2231 // {
2232 // point_rec *point[4];
2233 // ellipse_rec *ellipse = NULL;
2234 // crack_rec *crack = NULL;
2235 // double bmsz, imsz;
2236 // int i, ver_id1, ver_id2, ellipse_count, crack_count, num;
2237 // char buffer[1024];
2238 //
2239 // bmsz = cylinder -> boundary_msz;
2240 // imsz = cylinder -> internal_msz;
2241 //
2242 // sprintf(buffer, "\n# matrix (material %d)\n\n", cylinder -> property);
2243 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2244 // write_record(ctrl_file, ctrl_file_name, buffer);
2245 //
2246 // point[0] = &(cylinder -> lower_left);
2247 // point[1] = &(cylinder -> lower_right);
2248 // point[2] = &(cylinder -> upper_right);
2249 // point[3] = &(cylinder -> upper_left);
2250 //
2251 // for(i = 0; i < 4; i++){
2252 // vertex_id++;
2253 // if(bmsz == 0.0){
2254 // default_msz = YES;
2255 // sprintf(buffer, "vertex %d xyz %e %e %e\n", vertex_id, point[i] -> x, point[i] -> y, 0.0);
2256 // }
2257 // else
2258 // sprintf(buffer, "vertex %d xyz %e %e %e size %e\n", vertex_id, point[i] -> x, point[i] -> y, 0.0, bmsz);
2259 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2260 // }
2261 //
2262 // write_record(t3d_in_file, t3d_in_file_name, "\n");
2263 //
2264 // for(i = 0; i < 4; i++){
2265 // ver_id1 = vertex_id - 3 + i;
2266 // ver_id2 = ver_id1 + 1;
2267 // if(i == 3)ver_id2 -= 4;
2268 //
2269 // curve_id++;
2270 // sprintf(buffer, "curve %d vertex %d %d\n", curve_id, ver_id1, ver_id2);
2271 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2272 // }
2273 //
2274 // write_record(t3d_in_file, t3d_in_file_name, "\n");
2275 //
2276 // patch_id++;
2277 // if(imsz == 0.0){
2278 // default_msz = YES;
2279 // sprintf(buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d size def property %d", patch_id,
2280 // curve_id - 3, curve_id - 2, curve_id - 1, curve_id, cylinder -> property);
2281 // }
2282 // else
2283 // sprintf(buffer, "patch %d normal 0.0 0.0 1.0 boundary curve %d %d %d %d size %e property %d", patch_id,
2284 // curve_id - 3, curve_id - 2, curve_id - 1, curve_id, imsz, cylinder -> property);
2285 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2286 //
2287 // /* sprintf(buffer, "Patch %d\nElemType %d\n", patch_id, cylinder -> property); */
2288 // sprintf(buffer, "Patch %d\nFaceType %d\n", patch_id, cylinder -> property);
2289 // write_record(ctrl_file, ctrl_file_name, buffer);
2290 //
2291 // ellipse_count = 0;
2292 // for(i = 0; i < ellipses; i++){
2293 // ellipse = &(ellipse_array[i]);
2294 // if(ellipse -> patch == 0)continue;
2295 // ellipse_count++;
2296 // }
2297 //
2298 // if(ellipse_count != 0){
2299 // write_record(t3d_in_file, t3d_in_file_name, " \\\nsubpatch");
2300 //
2301 // num = 0;
2302 // for(i = 0; i < ellipses; i++){
2303 // ellipse = &(ellipse_array[i]);
2304 // if(ellipse -> patch == 0)continue;
2305 // num++;
2306 //
2307 // sprintf(buffer, " %d", ellipse -> patch);
2308 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2309 //
2310 // if(num % 30 == 0 && ellipse_count - num > 5)
2311 // write_record(t3d_in_file, t3d_in_file_name, " \\\n ");
2312 // }
2313 // }
2314 //
2315 // crack_count = 0;
2316 // for(i = 0; i < cracks; i++){
2317 // crack = &(crack_array[i]);
2318 // if(crack -> curve == 0)continue;
2319 // crack_count += 2;
2320 // if(crack -> ellipse == NULL)crack_count += 2;
2321 // }
2322 //
2323 // if(crack_count != 0){
2324 // write_record(t3d_in_file, t3d_in_file_name, " \\\nboundary curve");
2325 //
2326 // num = 0;
2327 // for(i = 0; i < cracks; i++){
2328 // crack = &(crack_array[i]);
2329 // if(crack -> curve == 0)continue;
2330 // num++;
2331 //
2332 // if(crack -> ellipse == NULL){
2333 // num++;
2334 // sprintf(buffer, " %d %d %d %d", -crack -> curve, crack -> curve + 1, crack -> curve + 2, -(crack -> curve + 3));
2335 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2336 // }
2337 // else{
2338 // sprintf(buffer, " %d %d", crack -> curve, -(crack -> curve + 1));
2339 // write_record(t3d_in_file, t3d_in_file_name, buffer);
2340 // }
2341 //
2342 // if(num % 10 == 0 && crack_count - num > 2)
2343 // write_record(t3d_in_file, t3d_in_file_name, " \\\n ");
2344 // }
2345 // }
2346 //
2347 // write_record(t3d_in_file, t3d_in_file_name, "\n");
2348 //
2349 // sprintf(buffer, "\n# Vertex %d (bottom left) %d (bottom right) %d (top right) %d (top left)\n",
2350 // vertex_id - 3, vertex_id - 2, vertex_id - 1, vertex_id);
2351 // write_record(ctrl_file, ctrl_file_name, buffer);
2352 // sprintf(buffer, "# Curve %d (bottom) %d (right) %d (top) %d (left)\n\n",
2353 // curve_id - 3, curve_id - 2, curve_id - 1, curve_id);
2354 // write_record(ctrl_file, ctrl_file_name, buffer);
2355 // }
2356 //
2357 //
2358 //
2359 // static logic
2360 // check_ellipse_inside_cylinder(ellipse_rec *ellipse, cylinder_rec *cylinder)
2361 // {
2362 // double cx, cy, max, min;
2363 //
2364 // cx = ellipse -> center.x;
2365 // cy = ellipse -> center.y;
2366 //
2367 // max = ellipse -> max + epsilon;
2368 // min = ellipse -> min + epsilon;
2369 //
2370 // if(cx - min_x <= min || max_x - cx <= min)return(NO);
2371 // if(cy - min_y <= min || max_y - cy <= min)return(NO);
2372 //
2373 // if(cx - min_x <= max){
2374 // if(check_ellipse_line_intersection(ellipse, &(cylinder -> lower_left), &(cylinder -> upper_left)) == YES)return(NO);
2375 // }
2376 // if(max_x - cx <= max){
2377 // if(check_ellipse_line_intersection(ellipse, &(cylinder -> lower_right), &(cylinder -> upper_right)) == YES)return(NO);
2378 // }
2379 // if(cy - min_y <= max){
2380 // if(check_ellipse_line_intersection(ellipse, &(cylinder -> lower_left), &(cylinder -> lower_right)) == YES)return(NO);
2381 // }
2382 // if(max_y - cy <= max){
2383 // if(check_ellipse_line_intersection(ellipse, &(cylinder -> upper_left), &(cylinder -> upper_right)) == YES)return(NO);
2384 // }
2385 //
2386 // return(YES);
2387 // }
2388 //
2389 //
2390 //
2391 
2393 {
2394  point_rec pnt1, pnt2, p1, p2;
2395  double max, max1, max2;
2396  double dist, dist1, dist2;
2397  double t1, tt1, ttt1, t2, tt2, ttt2, delta_t = EPSILON_T;
2398  int qq1, qqq1, qq2, qqq2;
2399  //int q1, q2;
2400 
2401  if (ellipse1 -> id == ellipse2 -> id)return(NO);
2402 
2403  max1 = ellipse1 -> max + epsilon;
2404  max2 = ellipse2 -> max + epsilon;
2405  max = max1 + max2;
2406 
2407  /* intersection of circumsribed circles */
2408  dist = dist_point (ellipse1 -> center, ellipse2 -> center);
2409  if (dist > max * max)return(NO);
2410 
2411  /* center of ellipse2 inside ellipse1 */
2412  if (check_point_inside_ellipse (&(ellipse2 -> center), ellipse1) == YES)return(YES);
2413 
2414  /* center of ellipse1 inside ellipse2 */
2415  if (check_point_inside_ellipse (&(ellipse1 -> center), ellipse2) == YES)return(YES);
2416 
2417  /* intersection of circle circumscribed to ellipse1 with ellipse2 */
2418  //q2 =
2419  project_point_to_ellipse (&(ellipse1 -> center), ellipse2, &pnt2, &t2);
2420  dist1 = dist_point (ellipse1 -> center, pnt2);
2421  if (dist1 > max1 * max1)return(NO);
2422 
2423  /* closest point on ellipse2 to center of ellipse1 inside ellipse1 */
2424  if (check_point_inside_ellipse (&pnt2, ellipse1) == YES)return(YES);
2425 
2426  /* intersection of circle circumscribed to ellipse2 with ellipse1 */
2427  //q1 =
2428  project_point_to_ellipse (&(ellipse2 -> center), ellipse1, &pnt1, &t1);
2429  dist2 = dist_point (ellipse2 -> center, pnt1);
2430  if (dist2 > max2 * max2)return(NO);
2431 
2432  /* closest point on ellipse1 to center of ellipse2 inside ellipse2 */
2433  if (check_point_inside_ellipse (&pnt1, ellipse2) == YES)return(YES);
2434 
2435  /* the iterations should not oscillate between quadrants because the circle tests have been already done */
2436 
2437  // termitovo: musel jsem zmensit delta_t, jinak to nedostatecne presne iterovalo
2438  // printf mi ukaze jak casto se to sem dostane
2439  //printf ("\nmeso3d iteration\n"); fflush(stdin);
2440 
2441  /* find closest points starting from pnt1 */
2442  while (YES) {
2443  qqq2 = project_point_to_ellipse (&pnt1, ellipse2, &p2, &ttt2);
2444  qq1 = project_point_to_ellipse (&p2, ellipse1, &pnt1, &tt1);
2445  if (fabs (t1 - tt1) < delta_t)break;
2446  t1 = tt1;
2447  }
2448 
2449  /* find closest points starting from pnt2 */
2450  while (YES) {
2451  qqq1 = project_point_to_ellipse (&pnt2, ellipse1, &p1, &ttt1);
2452  qq2 = project_point_to_ellipse (&p1, ellipse2, &pnt2, &tt2);
2453  if (fabs (t2 - tt2) < delta_t)break;
2454  t2 = tt2;
2455  }
2456 
2457  /* there is a problem that intersections of ellipses may be in different quadrants;
2458  in this case averaging of parameters makes no sense but it is clear that ellipses do intersect */
2459 
2460  if (qq1 != qqq1 || qq2 != qqq2)return(YES);
2461 
2462  t1 = (tt1 + ttt1) / 2.0;
2463  t2 = (tt2 + ttt2) / 2.0;
2464  get_ellipse_point_quadrant (ellipse1, qq1, t1, &pnt1);
2465  get_ellipse_point_quadrant (ellipse2, qq2, t2, &pnt2);
2466 
2467  /* check pnt1 inside ellipse2 */
2468  if (check_point_inside_ellipse (&pnt1, ellipse2) == YES)return(YES);
2469 
2470  /* check pnt2 inside ellipse1 */
2471  if (check_point_inside_ellipse (&pnt2, ellipse1) == YES)return(YES);
2472 
2473  return(NO);
2474 }
2475 
2476 
2477 //
2478 //
2479 //
2480 // static logic
2481 // check_ellipse_line_intersection(ellipse_rec *ellipse, point_rec *point1, point_rec *point2)
2482 // {
2483 // point_rec pnt1, pnt2;
2484 // double a0, a1, a2, a0x, a0y, a1x, a1y, a2x, a2y, D, max, min, t1, t2, dx, dy, dd;
2485 //
2486 // max = ellipse -> max + epsilon;
2487 // min = ellipse -> min + epsilon;
2488 //
2489 // transform_from_global_to_local(point1, &pnt1, &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
2490 // transform_from_global_to_local(point2, &pnt2, &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
2491 //
2492 // dx = pnt2.x - pnt1.x;
2493 // dy = pnt2.y - pnt1.y;
2494 // dd = sqrt(dx * dx + dy * dy);
2495 //
2496 // if(dd < EPSILON)error_message(GENERAL_ERROR, "Inclusion %d checked against intersection with zero length line", ellipse -> id);
2497 //
2498 // a0x = pnt1.x / max;
2499 // a0y = pnt1.y / min;
2500 // a0 = a0x * a0x + a0y * a0y - 1.0;
2501 //
2502 // a2x = dx / max;
2503 // a2y = dy / min;
2504 // a2 = a2x * a2x + a2y * a2y;
2505 //
2506 // a1x = a0x * a2x;
2507 // a1y = a0y * a2y;
2508 // a1 = a1x + a1y;
2509 //
2510 // D = a1 * a1 - a0 * a2;
2511 // if(D < 0.0)return(NO);
2512 // D = sqrt(D);
2513 //
2514 // t1 = -(a1 - D) / a2;
2515 // t2 = -(a1 + D) / a2;
2516 //
2517 // if(t1 >= 0.0 && t1 <= 1.0)return(YES);
2518 // if(t2 >= 0.0 && t2 <= 1.0)return(YES);
2519 //
2520 // return(NO);
2521 // }
2522 //
2523 //
2524 //
2525 // static logic
2526 // check_crack_cylinder_intersection(crack_rec *crack, cylinder_rec *cylinder)
2527 // {
2528 // if(check_line_line_intersection(&(crack -> center), &(crack -> tip),
2529 // &(cylinder -> lower_left), &(cylinder -> lower_right)) == YES)return(YES);
2530 // if(check_line_line_intersection(&(crack -> center), &(crack -> tip),
2531 // &(cylinder -> upper_left), &(cylinder -> upper_right)) == YES)return(YES);
2532 // if(check_line_line_intersection(&(crack -> center), &(crack -> tip),
2533 // &(cylinder -> lower_left), &(cylinder -> upper_left)) == YES)return(YES);
2534 // if(check_line_line_intersection(&(crack -> center), &(crack -> tip),
2535 // &(cylinder -> lower_right), &(cylinder -> upper_right)) == YES)return(YES);
2536 // return(NO);
2537 // }
2538 //
2539 //
2540 //
2541 // static logic
2542 // check_crack_ellipse_intersection(crack_rec *crack, ellipse_rec *ellipse)
2543 // {
2544 // if(crack -> ellipse == ellipse)return(NO);
2545 //
2546 // return(check_ellipse_line_intersection(ellipse, &(crack -> center), &(crack -> tip)));
2547 // }
2548 //
2549 //
2550 //
2551 // static logic
2552 // check_crack_crack_intersection(crack_rec *crack1, crack_rec *crack2)
2553 // {
2554 // if(crack1 -> id == crack2 -> id)return(NO);
2555 //
2556 // return(check_line_line_intersection(&(crack1 -> center), &(crack1 -> tip), &(crack2 -> center), &(crack2 -> tip)));
2557 // }
2558 //
2559 //
2560 //
2561 // static logic
2562 // check_crack_inside_ellipse(crack_rec *crack, ellipse_rec *ellipse)
2563 // {
2564 // if(check_point_inside_ellipse(&(crack -> center), ellipse) == YES)return(YES);
2565 // if(check_point_inside_ellipse(&(crack -> tip), ellipse) == YES)return(YES);
2566 //
2567 // return(NO);
2568 // }
2569 //
2570 //
2571 //
2572 
2574 {
2575  point_rec pnt;
2576  double x_rate, y_rate;
2577 
2578  transform_from_global_to_local (point, &pnt, &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
2579 
2580  x_rate = pnt.x / (ellipse -> max + epsilon);
2581  y_rate = pnt.y / (ellipse -> min + epsilon);
2582  if (x_rate * x_rate + y_rate * y_rate <= 1.0)return(YES);
2583 
2584  return(NO);
2585 }
2586 
2587 //
2588 //
2589 //
2590 // static logic
2591 // check_line_line_intersection(point_rec *pnta1, point_rec *pnta2, point_rec *pntb1, point_rec *pntb2)
2592 // {
2593 // point_rec pointa1, pointa2, pointb1, pointb2;
2594 // double dax, day, dbx, dby, dx, dy, ta, tb, dda, ddb, dd, dist, product, det;
2595 //
2596 // dax = pnta2 -> x - pnta1 -> x;
2597 // day = pnta2 -> y - pnta1 -> y;
2598 //
2599 // dbx = pntb2 -> x - pntb1 -> x;
2600 // dby = pntb2 -> y - pntb1 -> y;
2601 //
2602 // dda = sqrt(dax * dax + day * day);
2603 // ddb = sqrt(dbx * dbx + dby * dby);
2604 //
2605 // if(dda < EPSILON)error_message(GENERAL_ERROR, "Line intersection with zero length line");
2606 // if(ddb < EPSILON)error_message(GENERAL_ERROR, "Line intersection with zero length line");
2607 //
2608 // if(epsilon != 0){
2609 //
2610 // /* shift points by epsilon on each side */
2611 // pointa1.x = pnta1 -> x - dax / dda * epsilon;
2612 // pointa1.y = pnta1 -> y - day / dda * epsilon;
2613 // pointa2.x = pnta2 -> x - dax / dda * epsilon;
2614 // pointa2.y = pnta2 -> y - day / dda * epsilon;
2615 //
2616 // pointb1.x = pntb1 -> x - dbx / ddb * epsilon;
2617 // pointb1.y = pntb1 -> y - dby / ddb * epsilon;
2618 // pointb2.x = pntb2 -> x - dbx / ddb * epsilon;
2619 // pointb2.y = pntb2 -> y - dby / ddb * epsilon;
2620 //
2621 // dda += 2.0 * epsilon;
2622 // ddb += 2.0 * epsilon;
2623 //
2624 // pnta1 = &pointa1;
2625 // pnta2 = &pointa2;
2626 //
2627 // pntb1 = &pointb1;
2628 // pntb2 = &pointb2;
2629 // }
2630 //
2631 // dx = pntb1 -> x - pnta1 -> x;
2632 // dy = pntb1 -> y - pnta1 -> y;
2633 //
2634 // det = dbx * day - dby * dax;
2635 //
2636 // /* check for parallel lines */
2637 // if(fabs(det) < EPSILON){
2638 //
2639 // /* check their distance */
2640 // dd = dx * dx + dy * dy;
2641 // if(dd < epsilon * epsilon || dd < EPSILON * EPSILON)return(YES);
2642 //
2643 // product = (dax * dx + day * dy) / dda;
2644 // dist = fabs(1.0 - product * product / dd);
2645 // if(dist > epsilon * epsilon && dist > EPSILON * EPSILON)return(NO);
2646 //
2647 // /* check if they overlap */
2648 // dist = dd;
2649 // dx = pntb2 -> x - pnta2 -> x;
2650 // dy = pntb2 -> y - pnta2 -> y;
2651 // dd = dx * dx + dy * dy;
2652 // if(dist < dd)dist = dd;
2653 // dx = pntb2 -> x - pnta1 -> x;
2654 // dy = pntb2 -> y - pnta1 -> y;
2655 // dd = dx * dx + dy * dy;
2656 // if(dist < dd)dist = dd;
2657 // dx = pntb1 -> x - pnta2 -> x;
2658 // dy = pntb1 -> y - pnta2 -> y;
2659 // dd = dx * dx + dy * dy;
2660 // if(dist < dd)dist = dd;
2661 //
2662 // dist = sqrt(dist);
2663 //
2664 // if(dist > dda + ddb)return(NO);
2665 // return(YES);
2666 // }
2667 //
2668 // ta = (dbx * dy - dby * dx) / det;
2669 // tb = (dax * dy - day * dx) / det;
2670 //
2671 // if(ta < 0.0 || ta > 1.0)return(NO);
2672 // if(tb < 0.0 || tb > 1.0)return(NO);
2673 //
2674 // return(YES);
2675 // }
2676 //
2677 //
2678 //
2679 
2680 static int project_point_to_ellipse (point_rec *point, ellipse_rec *ellipse, point_rec *pnt, double *t_par)
2681 {
2682  point_rec grad, vec, point_spec, pnt_spec, p;
2683  double xx, yy, dist, norm, rate1 = 0.25, rate2 = 1.5, delta_t = EPSILON_T;
2684  double t = 0.5, dt, dtt, ddt, d_t = 0.0, max_dt = 0.25, rate;
2685  int sign = 0, sign_x = 0, sign_y = 0, iter = 0, quadrant = 0;
2686 
2687  /* move point to the first quadrant */
2688  transform_from_global_to_local (point, &p, &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
2689  xx = p.x;
2690  yy = p.y;
2691 
2692  if (xx == 0.0 && yy == 0.0)error_message (GENERAL_ERROR, "Point is in center of inclusion %d", ellipse -> id);
2693  if (ellipse -> max != ellipse -> min) {
2694  if (yy == 0.0) {
2695  rate = ellipse -> min / ellipse -> max;
2696  if (fabs (xx) < ellipse -> max * (1.0 - rate * rate))
2697  error_message (GENERAL_ERROR, "Point lies on major axis of inclusion %d", ellipse -> id);
2698  }
2699  }
2700 
2701  p.x = fabs (xx);
2702  p.y = fabs (yy);
2703 
2704  if (xx != 0.0)sign_x = (xx > 0.0) ? 1 : -1;
2705  if (yy != 0.0)sign_y = (yy > 0.0) ? 1 : -1;
2706 
2707  if (sign_x > 0) {
2708  if (sign_y > 0)
2709  quadrant = 1;
2710  else
2711  quadrant = 4;
2712  }
2713  else {
2714  if (sign_y > 0)
2715  quadrant = 2;
2716  else
2717  quadrant = 3;
2718  }
2719 
2720  if (sign_y == 0)sign = sign_x;
2721  if (sign_x == 0)sign = sign_y;
2722 
2723  if (sign != 0) {
2724  if (sign > 0)
2725  quadrant = 1;
2726  else
2727  quadrant = 3;
2728  }
2729 
2730  transform_from_local_to_global (&point_spec, &p, &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
2731 
2732  /* make projection (in the first quadrant) */
2733  while (YES) {
2734  get_ellipse_point (ellipse, t, &pnt_spec);
2735  norm = sqrt (get_ellipse_gradient (ellipse, t, &grad));
2736  sub_vec (vec, point_spec, pnt_spec);
2737  dist = dot_product (vec, grad) / norm;
2738 
2739  dt = dist / norm;
2740  if (fabs (dt) < delta_t)break;
2741 
2742  if ((ddt = fabs (dt)) > max_dt)dt /= ddt / max_dt;
2743 
2744  if (iter != 0) {
2745  if (dt * d_t < 0.0) {
2746  if (fabs (dt) > rate1 * fabs (d_t))dt = -d_t * rate1;
2747  }
2748  else {
2749  if (fabs (dt) > rate2 * fabs (d_t))dt = d_t * rate2;
2750  }
2751  }
2752 
2753  dtt = d_t = dt;
2754 
2755  if (dt < 0.0) {
2756  if (t + dt < 0.0)dtt = (0.0 - t) / 2.0;
2757  }
2758  if (dt > 0.0) {
2759  if (t + dt > 1.0)dtt = (1.0 - t) / 2.0;
2760  }
2761 
2762  iter++;
2763  t += (d_t = dtt);
2764 
2765  if (t < 0.0)t = 0.0;
2766  if (t > 1.0)t = 1.0;
2767  }
2768 
2769  /* move projection to original quadrant */
2770  transform_from_global_to_local (&pnt_spec, &p, &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
2771  p.x *= sign_x;
2772  p.y *= sign_y;
2773  transform_from_local_to_global (pnt, &p, &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
2774 
2775  //note: t is continuous (but not monotonic)
2776  // t = 0 on major axis
2777  // t = 1 on minor axis
2778  // to prevent confusion, quadrant is returned
2779  // x+,y+ 1
2780  // x-,y+ 2
2781  // x-,y- 3
2782  // x+,y- 4
2783  // zeros are included into quadrants 1 and 3
2784 
2785  *t_par = t;
2786  return(quadrant);
2787 }
2788 
2789 //
2790 //
2791 //
2792 static void
2793 get_ellipse_point_quadrant (ellipse_rec *ellipse, int quadrant, double t, point_rec *pnt)
2794 {
2795  point_rec p;
2796 
2797  get_ellipse_point (ellipse, t, pnt);
2798 
2799  /* move point to quadrant */
2800  if (quadrant != 1) {
2801  transform_from_global_to_local (pnt, &p, &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
2802  if (quadrant == 2 || quadrant == 3)p.x *= -1.0;
2803  if (quadrant == 4 || quadrant == 3)p.y *= -1.0;
2804  transform_from_local_to_global (pnt, &p, &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
2805  }
2806 }
2807 //
2808 //
2809 //
2810 // static double
2811 // get_ellipse_gradient_quadrant(ellipse_rec *ellipse, int quadrant, double t, point_rec *grad)
2812 // {
2813 // point_rec pnt, g;
2814 // double norm;
2815 //
2816 // norm = get_ellipse_gradient(ellipse, t, grad);
2817 //
2818 // /* move grad to quadrant */
2819 // if(quadrant != 1){
2820 // pnt.x = pnt.y = 0.0;
2821 // transform_from_global_to_local(grad, &g, &pnt, ellipse -> cos_angle, ellipse -> sin_angle);
2822 // if(quadrant == 2 || quadrant == 3)g.x *= -1.0;
2823 // if(quadrant == 4 || quadrant == 3)g.y *= -1.0;
2824 // transform_from_local_to_global(grad, &g, &pnt, ellipse -> cos_angle, ellipse -> sin_angle);
2825 // }
2826 //
2827 // return(norm);
2828 // }
2829 //
2830 //
2831 //
2832 // static void
2833 // get_ellipse_normal_quadrant(ellipse_rec *ellipse, int quadrant, double t, point_rec *normal)
2834 // {
2835 // point_rec pnt, n;
2836 //
2837 // get_ellipse_normal(ellipse, t, normal);
2838 //
2839 // /* move normal to quadrant */
2840 // if(quadrant != 1){
2841 // pnt.x = pnt.y = 0.0;
2842 // transform_from_global_to_local(normal, &n, &pnt, ellipse -> cos_angle, ellipse -> sin_angle);
2843 // if(quadrant == 2 || quadrant == 3)n.x *= -1.0;
2844 // if(quadrant == 4 || quadrant == 3)n.y *= -1.0;
2845 // transform_from_local_to_global(normal, &n, &pnt, ellipse -> cos_angle, ellipse -> sin_angle);
2846 // }
2847 // }
2848 //
2849 //
2850 //
2851 static void get_ellipse_point (ellipse_rec *ellipse, double t, point_rec *pnt)
2852 {
2853  double weight = 0.707106781;
2854  double B0, B1, B2, Bx, By;
2855  double sum_B;
2856 
2857  B0 = B_0 (t);
2858  B1 = B_1 (t) * weight;
2859  B2 = B_2 (t);
2860 
2861  sum_B = B0 + B1 + B2;
2862 
2863  Bx = B0 * ellipse -> pnt0.x + B1 * ellipse -> pnt1.x + B2 * ellipse -> pnt2.x;
2864  By = B0 * ellipse -> pnt0.y + B1 * ellipse -> pnt1.y + B2 * ellipse -> pnt2.y;
2865 
2866  pnt -> x = Bx / sum_B;
2867  pnt -> y = By / sum_B;
2868 }
2869 
2870 static double get_ellipse_gradient (ellipse_rec *ellipse, double t, point_rec *grad)
2871 {
2872  double weight = 0.707106781;
2873  double B0, B1, B2, dB0, dB1, dB2;
2874  double sum_B, sum_dB, sum_B2, Bx, By, dBx, dBy;
2875 
2876  B0 = B_0 (t);
2877  B1 = B_1 (t) * weight;
2878  B2 = B_2 (t);
2879 
2880  dB0 = dB_0 (t);
2881  dB1 = dB_1 (t) * weight;
2882  dB2 = dB_2 (t);
2883 
2884  sum_B = B0 + B1 + B2;
2885  sum_dB = dB0 + dB1 + dB2;
2886 
2887  sum_B2 = sum_B * sum_B;
2888 
2889  Bx = B0 * ellipse -> pnt0.x + B1 * ellipse -> pnt1.x + B2 * ellipse -> pnt2.x;
2890  By = B0 * ellipse -> pnt0.y + B1 * ellipse -> pnt1.y + B2 * ellipse -> pnt2.y;
2891 
2892  dBx = dB0 * ellipse -> pnt0.x + dB1 * ellipse -> pnt1.x + dB2 * ellipse -> pnt2.x;
2893  dBy = dB0 * ellipse -> pnt0.y + dB1 * ellipse -> pnt1.y + dB2 * ellipse -> pnt2.y;
2894 
2895  grad -> x = (dBx * sum_B - Bx * sum_dB) / sum_B2;
2896  grad -> y = (dBy * sum_B - By * sum_dB) / sum_B2;
2897 
2898  return(size_vec (*grad));
2899 }
2900 
2901 //
2902 //
2903 //
2904 // static void
2905 // get_ellipse_normal(ellipse_rec *ellipse, double t, point_rec *normal)
2906 // {
2907 // point_rec grad;
2908 // double norm;
2909 //
2910 // norm = get_ellipse_gradient(ellipse, t, &grad);
2911 // norm = sqrt(norm);
2912 //
2913 // normal -> x = grad.y;
2914 // normal -> y = -grad.x;
2915 //
2916 // div_vec(*normal, norm);
2917 // }
2918 //
2919 //
2920 //
2921 
2922 static void transform_from_global_to_local (point_rec *global, point_rec *local, point_rec *origin, double cos_angle, double sin_angle)
2923 {
2924  double delta_x, delta_y;
2925 
2926  delta_x = global -> x - origin -> x;
2927  delta_y = global -> y - origin -> y;
2928 
2929  local -> x = cos_angle * delta_x + sin_angle * delta_y;
2930  local -> y = cos_angle * delta_y - sin_angle * delta_x;
2931 }
2932 
2933 void transform_from_local_to_global (point_rec *global, point_rec *local, point_rec *origin, double cos_angle, double sin_angle)
2934 {
2935  global -> x = cos_angle * local -> x - sin_angle * local -> y + origin -> x;
2936  global -> y = cos_angle * local -> y + sin_angle * local -> x + origin -> y;
2937 }
2938 
2939 //
2940 //
2941 //
2942 // static char *
2943 // get_next_record(FILE *file, char *file_name, char *err_msg)
2944 // {
2945 // char *buf = NULL;
2946 //
2947 // if((buf = fgets(line_buffer, BUFFER_SIZE, file)) == NULL){
2948 // if(!feof(file))error_message(FILE_READ_ERROR, "File %s reading error", file_name);
2949 // if(err_msg == NULL)return(NULL);
2950 // error_message(INPUT_ERROR, "%s", err_msg);
2951 // }
2952 // return(buf);
2953 // }
2954 //
2955 //
2956 //
2957 // static char *
2958 // get_next_relevant_record(FILE *file, char *file_name, char *err_msg)
2959 // {
2960 // char *buf = NULL, *character = NULL;
2961 //
2962 // do{
2963 // if((buf = get_next_record(file, file_name, err_msg)) == NULL)return(NULL);
2964 // character = line_buffer;
2965 // while(*character == SPACE || *character == TABULATOR)character++;
2966 // }while(*character == NEWLINE || *character == REMARK);
2967 // return(buf);
2968 // }
2969 //
2970 //
2971 //
2972 // static void
2973 // write_record(FILE *file, char *file_name, char *buffer)
2974 // {
2975 // if(fprintf(file, "%s", buffer) < 0)
2976 // error_message(FILE_WRITE_ERROR, "File %s writing error", file_name);
2977 // }
2978 //
2979 //
2980 //
2981 
2982 
2983 // Lukasovo - odstraneno static
2984 void error_message (int exit_code, const char *format, ...)
2985 {
2986  char buffer[1024];
2987  va_list args;
2988 
2989  va_start (args, format);
2990  vsprintf (buffer, format, args);
2991  va_end (args);
2992 
2993  if (exit_code != WARNING && exit_code != NO_ERROR) {
2994  fprintf (stderr, "\nError: %s\n\n", buffer);
2995 
2996 #ifdef ELIXIR
2997  if(ElixirInitialized() == YES){
2998  strcat(buffer, "\n\n");
2999  ESIEventLoop(YES, buffer);
3000  }
3001 #endif
3002 
3003  exit (exit_code);
3004  }
3005 
3006  if (exit_code == WARNING)
3007  fprintf (stderr, "Warning: %s\n", buffer);
3008  else
3009  fprintf (stderr, "%s\n", buffer);
3010 }
3011 
3012 //
3013 //
3014 //
3015 // //#ifdef ELIXIR
3016 // //
3017 // //static void
3018 // //draw_point(point_rec *pnt, EPixel color)
3019 // //{
3020 // // WCRec point[1];
3021 // // GraphicObj *gr_obj = NULL;
3022 // // unsigned long mask = 0L;
3023 // //
3024 // // mask |= LAYER_MASK;
3025 // // mask |= COLOR_MASK;
3026 // // mask |= MTYPE_MASK;
3027 // // mask |= MSIZE_MASK;
3028 // //
3029 // // EASValsSetLayer(0);
3030 // // EASValsSetColor(color);
3031 // // EASValsSetMType(FILLED_CIRCLE_MARKER);
3032 // // EASValsSetMSize(6);
3033 // //
3034 // // point[0].z = 0.0;
3035 // //
3036 // // copy_vec(point[0], *pnt);
3037 // //
3038 // // if((gr_obj = CreateMarker3D(point)) == NULL){
3039 // // ERptErrMessage(ELIXIR_ERROR_CLASS, 2, "Failure of graphics creation", ERROR_GRADE);
3040 // // exit(ESISetExitCode(2));
3041 // // }
3042 // //
3043 // // EGWithMaskChangeAttributes(mask, gr_obj);
3044 // // EMAddGraphicsToModel(ESIModel(), gr_obj);
3045 // //}
3046 // //
3047 // //
3048 // //
3049 // //static void
3050 // //draw_line(point_rec *pnt1, point_rec *pnt2, EPixel color)
3051 // //{
3052 // // WCRec point[2];
3053 // // GraphicObj *gr_obj = NULL;
3054 // // unsigned long mask = 0L;
3055 // //
3056 // // mask |= LAYER_MASK;
3057 // // mask |= COLOR_MASK;
3058 // // mask |= STYLE_MASK;
3059 // // mask |= SHRINK_MASK;
3060 // //
3061 // // EASValsSetLayer(0);
3062 // // EASValsSetColor(color);
3063 // // EASValsSetFillStyle(SOLID_STYLE);
3064 // // EASValsSetShrink(1.0);
3065 // //
3066 // // point[0].z = point[1].z = 0.0;
3067 // //
3068 // // copy_vec(point[0], *pnt1);
3069 // // copy_vec(point[1], *pnt2);
3070 // //
3071 // // if((gr_obj = CreateLine3D(point)) == NULL){
3072 // // ERptErrMessage(ELIXIR_ERROR_CLASS, 2, "Failure of graphics creation", ERROR_GRADE);
3073 // // exit(ESISetExitCode(2));
3074 // // }
3075 // //
3076 // // EGWithMaskChangeAttributes(mask, gr_obj);
3077 // // EMAddGraphicsToModel(ESIModel(), gr_obj);
3078 // //}
3079 // //
3080 // //
3081 // //
3082 // //
3083 // //static void
3084 // //draw_elliptic_arc(point_rec *pnt1, point_rec *pnt2, point_rec *pnt3, double w1, double w2, double w3, EPixel color)
3085 // //{
3086 // // WCRec point[3];
3087 // // float weight[3];
3088 // // GraphicObj *gr_obj = NULL;
3089 // // unsigned long mask = 0L;
3090 // //
3091 // // mask |= LAYER_MASK;
3092 // // mask |= COLOR_MASK;
3093 // // mask |= STYLE_MASK;
3094 // // mask |= WIDTH_MASK;
3095 // // mask |= SHOW_POLY_MASK;
3096 // // mask |= TESSEL_INTERVALS_MASK;
3097 // //
3098 // // EASValsSetLayer(0);
3099 // // EASValsSetColor(color);
3100 // // EASValsSetFillStyle(SOLID_STYLE);
3101 // // EASValsSetLineWidth(0);
3102 // // EASValsSetShowPoly(NO);
3103 // // EASValsSetTesselIntervals(32);
3104 // //
3105 // // point[0].z = point[1].z = point[2].z = 0.0;
3106 // //
3107 // // copy_vec(point[0], *pnt1);
3108 // // copy_vec(point[1], *pnt2);
3109 // // copy_vec(point[2], *pnt3);
3110 // //
3111 // // weight[0] = w1;
3112 // // weight[1] = w2;
3113 // // weight[2] = w3;
3114 // //
3115 // // if((gr_obj = CreateRBezC3D(3, point, weight)) == NULL){
3116 // // ERptErrMessage(ELIXIR_ERROR_CLASS, 2, "Failure of graphics creation", ERROR_GRADE);
3117 // // exit(ESISetExitCode(2));
3118 // // }
3119 // //
3120 // // EGWithMaskChangeAttributes(mask, gr_obj);
3121 // // EMAddGraphicsToModel(ESIModel(), gr_obj);
3122 // //}
3123 // //
3124 // //
3125 // //
3126 // //
3127 // //static void
3128 // //draw_cylinder(cylinder_rec *cylinder, EPixel color)
3129 // //{
3130 // // draw_line(&(cylinder -> lower_left), &(cylinder -> lower_right), color);
3131 // // draw_line(&(cylinder -> upper_left), &(cylinder -> upper_right), color);
3132 // // draw_line(&(cylinder -> lower_left), &(cylinder -> upper_left), color);
3133 // // draw_line(&(cylinder -> lower_right), &(cylinder -> upper_right), color);
3134 // //}
3135 // //
3136 // //
3137 // //
3138 // //static void
3139 // //draw_ellipse(ellipse_rec *ellipse, EPixel color)
3140 // //{
3141 // // point_rec point_loc[3], point_glob[3];
3142 // // int i, signx[4] = {1, -1, -1, 1}, signy[4] = {1, 1, -1, -1};
3143 // //
3144 // // point_loc[2].x = point_loc[0].y = 0.0;
3145 // //
3146 // // for(i = 0; i < 4; i++){
3147 // // point_loc[0].x = point_loc[1].x = ellipse -> max * signx[i];
3148 // // point_loc[1].y = point_loc[2].y = ellipse -> min * signy[i];
3149 // //
3150 // // transform_from_local_to_global(&(point_glob[0]), &(point_loc[0]), &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
3151 // // transform_from_local_to_global(&(point_glob[1]), &(point_loc[1]), &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
3152 // // transform_from_local_to_global(&(point_glob[2]), &(point_loc[2]), &(ellipse -> center), ellipse -> cos_angle, ellipse -> sin_angle);
3153 // //
3154 // // draw_elliptic_arc(&(point_glob[0]), &(point_glob[1]), &(point_glob[2]), 1.0, 0.707106781, 1.0, color);
3155 // // }
3156 // //}
3157 // //
3158 // //
3159 // //
3160 // //static void
3161 // //draw_crack(crack_rec *crack, EPixel color)
3162 // //{
3163 // // draw_line(&(crack -> center), &(crack -> tip), color);
3164 // //}
3165 // //
3166 // //
3167 // //
3168 // //void
3169 // //ESICustomize(Widget parent_pane)
3170 // //{
3171 // //}
3172 // //
3173 // //#endif
3174 
3175 } // end of namespace meso2d
point_rec center
Definition: meso2d.h:61
#define sub_vec(RES, VEC1, VEC2)
Definition: meso2d.cpp:106
#define GENERAL_ERROR
Definition: meso2d.cpp:66
#define B_0(T)
Definition: meso2d.cpp:86
Ellipsoid record.
Definition: meso2d.h:57
void transfom_ellipse_rec(meso2d::ellipse_rec &L)
ADDED for muMech needs.
Definition: meso2d.cpp:317
#define dB_0(T)
Definition: meso2d.cpp:90
point_rec pnt0
Definition: meso2d.h:66
MESO2d - library of functions for geometry analysis of ellipses and preprocesor for T3d...
#define WARNING
Definition: meso2d.cpp:65
#define EPSILON
Definition: meso2d.cpp:76
static void error_message(int exit_code, const char *format,...)
Definition: meso2d.cpp:2984
static void get_ellipse_point(ellipse_rec *ellipse, double t, point_rec *pnt)
Definition: meso2d.cpp:2851
point_rec pnt1
Definition: meso2d.h:66
#define B_1(T)
Definition: meso2d.cpp:87
bool check_ellipse_ellipse_overlap(ellipse_rec *ellipse1, ellipse_rec *ellipse2)
Definition: meso2d.cpp:2392
#define dB_1(T)
Definition: meso2d.cpp:91
static logic check_point_inside_ellipse(point_rec *point, ellipse_rec *ellipse)
Definition: meso2d.cpp:2573
static double get_ellipse_gradient(ellipse_rec *ellipse, double t, point_rec *grad)
Definition: meso2d.cpp:2870
bool isZero(double zero, double a)
Definition: meso2d.cpp:310
double internal_msz
Definition: meso2d.h:63
#define B_2(T)
Definition: meso2d.cpp:88
#define dist_point(PNT1, PNT2)
Definition: meso2d.cpp:98
#define EPSILON_T
Definition: meso2d.cpp:77
point_rec pnt2
Definition: meso2d.h:66
static double epsilon
Definition: meso2d.cpp:172
static void transform_from_global_to_local(point_rec *global, point_rec *local, point_rec *origin, double cos_angle, double sin_angle)
Definition: meso2d.cpp:2922
double cos_angle
Definition: meso2d.h:65
#define NO_ERROR
Definition: meso2d.cpp:64
static void transform_from_local_to_global(point_rec *global, point_rec *local, point_rec *origin, double cos_angle, double sin_angle)
Definition: meso2d.cpp:2933
#define size_vec(VEC)
Definition: meso2d.cpp:96
#define dB_2(T)
Definition: meso2d.cpp:92
double boundary_msz
Definition: meso2d.h:63
static void get_ellipse_point_quadrant(ellipse_rec *ellipse, int quadrant, double t, point_rec *pnt)
Definition: meso2d.cpp:2793
Point record.
Definition: meso2d.h:50
#define dot_product(VEC1, VEC2)
Definition: meso2d.cpp:109
double sin_angle
Definition: meso2d.h:65
static int project_point_to_ellipse(point_rec *point, ellipse_rec *ellipse, point_rec *pnt, double *t_par)
Definition: meso2d.cpp:2680
void check_ellipse_rec_consistency(meso2d::ellipse_rec &L)
ADDED for muMech needs.
Definition: meso2d.cpp:282
#define INPUT_ERROR
Definition: meso2d.cpp:72