⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 block.cpp

📁 算法的一些集合
💻 CPP
字号:
#include "include\vs.h"
#include "include\dynamic_array.h"
#include "include\omega_h.h"
#include "include\block.h"

void block(Omega_h* oh, int row_node_no, int column_node_no, int
	control_node_no, int* control_node_flag, double* coord,
   int first_node_no, int first_element_no, int column_node_skip, int column_element_skip,
   int element_type_id, int matrial_type_id) {
   double v[2];
   C0 x(control_node_no, 2, coord), N(control_node_no, (double*)0);
	for(int i = 0; i < row_node_no; i++)
   for(int j = 0; j < column_node_no; j++) {
   	int nn = first_node_no + i*(column_node_no+column_node_skip) + j;
      v[0] = 2.0*(double)j/(double)(column_node_no-1)-1.0; // natural coordinates
      v[1] = 2.0*(double)i/(double)(row_node_no-1)-1.0;
      shape(v, control_node_no, control_node_flag, N);
   	C0 X = N*x;                                           // physical Coordinates
      v[0] = X[0]; v[1] = X[1];
      Node* node = new Node(nn, 2, v);
      oh->set(node);
   }
   switch(EP::ep) {
   	case EP::QUADRILATERALS_4_NODES:
      	q4(oh->omega_eh_array(), row_node_no, column_node_no, first_node_no, first_element_no,
         	column_node_skip, column_element_skip, element_type_id, matrial_type_id);
      	break;
      case EP::LAGRANGIAN_9_NODES:
      	l9(oh->omega_eh_array(), row_node_no, column_node_no, first_node_no, first_element_no,
         	column_node_skip, column_element_skip, element_type_id, matrial_type_id);
      	break;
   }
}

void shape(double* v, int control_node_no, int* control_node_flag, C0& N) {
	C0 Zai(v[0]), Eta(v[1]);
   // shape function of 4 to 9 nodes quadrilateral
   // initial four corner nodes
   N[0] = (1-Zai)*(1-Eta)/4; N[1] = (1+Zai)*(1-Eta)/4;
   N[2] = (1+Zai)*(1+Eta)/4; N[3] = (1-Zai)*(1+Eta)/4;
   if(control_node_no == 9 && control_node_flag[8]) {
      // add center node
      N[8] = (1-Zai.pow(2))*(1-Eta.pow(2));
      // modification to four corner nodes due to the presence of the center node
      N[0] -= N[8]/4; N[1] -= N[8]/4; N[2] -= N[8]/4; N[3] -= N[8]/4;
   }
   if(control_node_no > 4) {
      if(control_node_no >= 5) {
      	if(control_node_flag[4]) {
         	// add edge node
            N[4] = (1-Zai.pow(2))*(1-Eta)/2;
            // modification of the edge node due to the presence of center node
            if(control_node_no == 9) N[4] -= N[8]/2;
            // modification of corner nodes due to the presence of the edge node
            N[0] -= N[4] / 2; N[1] -= N[4]/2;
         } else N[4] = 0.0;
      }
      if(control_node_no >= 6) {
         if(control_node_flag[5]) {
            // add edge node
            N[5] = (1-Eta.pow(2))*(1+Zai)/2;
            // modification of the edge node due to the presence of center node
            if(control_node_no == 9) N[5] -= N[8]/2;
            // modification of corner nodes due to the presence of the edge node
            N[1] -= N[5] / 2; N[2] -= N[5]/2;
         } else N[5] = 0.0;
      }
      if(control_node_no >= 7) {
         if(control_node_flag[6]) {
            // add edge node
            N[6] = (1-Zai.pow(2))*(1+Eta)/2;
            // modification of the edge node due to the presence of center node
            if(control_node_no == 9) N[6] -= N[8]/2;
            // modification of corner nodes due to the presence of the edge node
            N[2] -= N[6] / 2; N[3] -= N[6]/2;
         } else N[6] = 0.0;
      }
      if(control_node_no >= 8) {
         if(control_node_flag[7]) {
            // add edge node
            N[7] = (1-Eta.pow(2))*(1-Zai)/2;
            // modification of the edge node due to the presence of center node
            if(control_node_no == 9) N[7] -= N[8]/2;
            // modification of corner nodes due to the presence of the edge node
            N[3] -= N[7] / 2; N[0] -= N[7]/2;
         } else N[7] = 0.0;
      }
   }

}

void q4(Dynamic_Array<Omega_eh>& element_array, int row_node_no, int column_node_no,
	int first_node_no, int first_element_no, int column_node_skip, int column_element_skip,
   int element_type_id, int material_type_id) {
   int row_element_no = row_node_no -1,
       column_element_no = column_node_no -1;
   for(int i = 0; i < row_element_no; i++)
   for(int j = 0; j < column_element_no; j++) {
       int nn = first_node_no + i*(column_node_no+column_node_skip) + j; // node number at lower left corner
       int ena[4]; ena[0] = nn; ena[1] = ena[0]+1; ena[3] = nn + column_node_no+column_node_skip; ena[2] = ena[3]+1;
       int en = first_element_no + i*(column_element_no+column_element_skip)+j;       Omega_eh* elem = new Omega_eh(en, element_type_id, material_type_id, 4, ena);       element_array.add(elem);
   }
}

void l9(Dynamic_Array<Omega_eh>& element_array, int row_node_no, int column_node_no,
	int first_node_no, int first_element_no, int column_node_skip, int column_element_skip,
   int element_type_id, int material_type_id) {
   // define elements
   int row_element_no = (row_node_no-1)/2,
       column_element_no = (column_node_no-1)/2;
   for(int i = 0; i < row_element_no; i++)
   for(int j = 0; j < column_element_no; j++) {
       int nn = first_node_no + 2*i*(column_node_no+column_node_skip) + 2*j; // node number at lower left corner
       int ena[9];
       ena[0] = nn; ena[1] = ena[0]+2; ena[3] = nn + 2*(column_node_no+column_node_skip); ena[2] = ena[3]+2;
       ena[4] = ena[0] + 1; ena[5] = ena[1]+column_node_no+column_node_skip; ena[6] = ena[3]+1;
       ena[7] = ena[0] + column_node_no+column_node_skip; ena[8] = ena[7]+1;
       int en = first_element_no + i*(column_element_no+column_element_skip)+j;       Omega_eh* elem = new Omega_eh(en, element_type_id, material_type_id, 9, ena);       element_array.add(elem);
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -