C ROSS URVES
2.4 GIỚI THIỆU CHƯƠNG TRÌNH TÍNH TÍNH NỔI TÀU
Qui ước đánh số sườn, đường nước.
+ Sườn #0 qua trụ lái, sườn thứ 10 ( hoặc sườn 20) qua trụ mũi + WL 0 bắt đầu từđường cơ bản, các WL tiếp theo lên cao dần. + Khoảng cách vịm lái, lấy giá trị + nếu nằm trước trụ lái
Chuẩn bị dữ liệu:
+ NS- tổng số sườn tính tốn
+ NW- tổng sốđường nước tính tốn. Mặt boong tàu được coi là đường số NW+1
+ Số thứ tự các đường nước, số thực, ví dụ:0, 0.5, 0.75, 1, 1.5,2, vv... Hình 2.32
+ Số thứ tựđường nước, số thực, ví dụ: 0, 0.5, 1, 1.5, 2 vv... + Chiều dài thật các đường nước vừa đăng ký
+ Tọa độ vịm đuơi,tính cho các đường nước vừa đăng ký, dấu theo H.4. + Chiều cao H, cho tất cả sườn tính tốn.
+ Tọa độ vỏ tàu, lấy 1/2 chiều rơng tàu. Thứ tự đọc: bắt đầu từ sườn đầu tiên, ví dụ #0; trong mỗi sườn đọc giá trị y của đường nước đầu tiên, ví dụ WL0, đến đường nước cuối cùng là NW+1 ( mép boong).
Sử dụng chương trình Nhập dữ liệu
Tong so suon: số sườn tính tốn
So duong nuoc: sốđường nước tính tốn
Chieu dai Lpp: chiêu dài giữa hai trụ, m
Khoảng suon dL: khoảng sườn lý thuyết, m
Khoang duong nuoc dT: khoảng đường nước,m
Nhap so thu tu ( số sườn) phai tinh: nhập đủ số chỉ vị trí sườn. Các giá trị cách nhau khoảng trống.
Nhap chieu cao ( số sườn): tồn bộ chiều cao của các sườn. Các giá trị cách nhau khoảng trống.
Nhap so thu tu (sốđường nước): số thứ tự của WL, từ dưới lên boong
Chieu dai that ( số đường nước): giá trị chiều dài thật các đường nước, m. Các giá trị cách nhau khoảng trống.
Khoang cach vom lai den truc sau ( sốđường nước): Khoảng cách cùng giá trị (+), (-) như hình 4 trên.
Toa do vo tau: Tọa độ vỏ tàu ( ½ chiều rộng),nhập theo hướng dẫn ghi tại màn hình đối thoại.
Toa do diem vao nuoc: Toạđộ diểm để nước tràn vào tàu, giá trị y và z, đo bằng m
Ghi chú: Điểm chọn cĩ thể như hình bên cạnh hoặc tại mép boong.
Các file chứa dữ liệu:
H.DAT - dữ liệu đầu vào, nhập từ bàn phím. Gọi và sửa bằng trình EDIT của DOS. H.OUT - dữ liệu đầu ra
STAB.OUT - Bảng tính bằng số tay địn ổn định tĩnh và ổn định động, tính bằng <m>, cách nhau 10° một lần tính. Giá trị trong bảng tương ứng đồ thịđược hiện trên màn hình.
Các file sau đây chứa giá trị trung gian FIRSOV.OUT - biểu đồ Firsov
CROSS.dat - giá trị pantokaren
BON.dat giá trị biểu đồ Bonjean dùng khi vẽđồ thị.
Giá trị tính tốn và ký hiệu trên các đồ thị cĩ nghĩa như sau: KB- chiều cao tâm nổi
BM- bán kính ổn tâm GM - chiều cao tâm ổn định
Tay địn trong đồ thị pantokaren được xác định như trên hình bên. Lk là khoảng cách từ K đến đường vuơng gĩc với đường nước nghiêng, đi qua tâm nổi phần chìm - điểm B’.
Chương trình viết bằng ngơn ngữ C.
Dưới đây sẽ trình bày nội dung chương trình tính bằng ngơn ngữ C. 1/ IntegrationV() - tính tích phân cĩ giơí hạn trên thay đổi I(z) = ∫ f(z)dz 2/ Integ() - tích phân giới hạn dưới từ a đến giới hạn trên b: I = ∫f(x)dx 3/ Lag() - Nội suy (ngoại suy) Lagrange
4/ Inputfiles - ghi dữ liệu vào file H.dat
5/ Crossfiles - ghi dữ liệu trung gian vào file cross.dat
6/ FirsoffDiagram - ghi giá trị tính biểu đồ Firsov ra file firsoff.out 7/ BonjeanGr - biểu đồ Bonjean
8/ CrossCurveGr - đồ thị pantokaren
9/ StabilityCurvesGr - đồ thi ổn định tĩnh và động 10/ Stability - Ổn định tàu.
Trích đoạn chương trình bằng ngơn ngữ C cĩ dạng như sau.
/* Program HydrostaticCurves; */ #include <stdio.h> #include <conio.h> #include <io.h> #include <math.h> #include <stdlib.h> #include <ctype.h> #include <time.h> #include <graphics.h> #define sqr(A) (A) * (A) char ship[20];
int Nwplus1, Nw, Ns,Index, Midship ; int MaxX, MaxY, MaxColors;
float Lpp, dt, dl, yfa, zfa, Cend, Afj, Haftl, Breadth, BxL, d; float Phi, SinPhi, CosPhi, TangPhi, db, dz, an, bn, cn;
float yy[9][2]; float aux[100];
float **y, **sa, **sm;
float *WL, *Wa, *dis, *VOL, *xb, *KB, *BML, *CW, *CB, *CM, *CP; float *ILc, *It, *BMt, *Af, *Low, *St, *H, *xl, *xa, *zz; float *bb, *cc, *ff, *z, *Aw, *amm, *am, *displa, *trim; FILE *inf, *outf, *cross, *bon ;
void StabilityCurvesGr() { char buffer[20]; int k, j; int Nn,x0,y0,x1,y1,x2,y2,y01,y10,ErrorCode,graphdriver,GraphMode ; int p0,KK ; float vmax,lmax,c4, p,p3,p2,p03 ; graphdriver = DETECT;
initgraph(&graphdriver, &GraphMode, "..\\BGI"); ErrorCode = graphresult(); if ( ErrorCode != 0 ) { fprintf(stderr,"%s",grapherrormsg(ErrorCode)); exit(1); } MaxY = getmaxy(); MaxX = getmaxx(); MaxColors = getmaxcolor() + 1; vmax =0; lmax =0; for (j =1 ; j < 9; j++) { if ( cc[j] > lmax) lmax = cc[j];
if (CB[j] > vmax ) vmax = CB[j]; }
if (lmax < vmax ) lmax = vmax;
c4= cc[3]; if (c4 < cc[2] ) c4= cc[2]; if (c4 <= 0.0 ) c4 = lmax; KK= (int) (lmax/c4 +0.5); if (KK <= 1) KK=2; p2= c4/2.0; KK= (KK+1)*2; y0= MaxY -20; y1= y0 / KK; x0= MaxX-10; x1 = x0 / 12; cleardevice(); settextstyle(0,0,1); for (j = 1 ;j <= KK+1;j++) { k= KK-2-j; p=(k*p2)*1000.0; sprintf(buffer,"%8.0f",p); outtextxy(0,j*y1,buffer); line(0,y1*j,x0,y1*j); } settextstyle(0,1,1); outtextxy(10,10,"Lst & Ld [mm]"); for (j = 0 ; j <= 12;j++) { sprintf(buffer,"%2d", (j-3)*10 ); p0=j*x1;
outtextxy(p0, (KK-2)*y1, buffer); line(p0,0,p0,y0); } setlinestyle(SOLID_LINE,0,NORM_WIDTH); y01=(KK-2)*y1; p3 = (y0-y01)/c4; for (j=0 ; j <= 11; j++) { if (j < 3) { k= 3-j; p= -cc[k]; p03= CB[k]; vmax= -cc[k-1]; p2= CB[k-1]; } else { k= j-3; p= cc[k]; p03= CB[k]; vmax= cc[k+1]; p2= CB[k+1]; }
y10= y01- (int) (p3*p); y2= y01- (int) (vmax*p3); if ( y10 < 0 ) y10 = 0; if ( y2 < 0 ) y2=0;
if ( y10 > y0) y10=y0; if ( y2 > y0 ) y2=y0;
line(j*x1,y10,(j+1)*x1,y2); y10= y01- (int) (p3*p03);
y2= y01 - (int) (p3* p2); if ( y10 < 0 ) y10 = 0; if ( y2 < 0 ) y2=0;
if ( y10 > y0) y10=y0; if ( y2 > y0 ) y2=y0;
delay(100); } getch(); closegraph(); } void Stability() { int n,km, i, j, k ; int KK;
printf("\nNumber of States N = "); scanf("%d", &n); CB = calloc( 10, sizeof( float ));
Wa = calloc( n, sizeof( float )); dis = calloc( n, sizeof( float ));