Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 08.02.2016
Сообщений: 3

Чтение данных с файла и запись результатов в другой файл МКЭ C++

24.12.2017, 16:35. Показов 1322. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дана программа, которая никак не считывает файл (test4.inp), и не может записать результаты в другой файл (test4.out). Где косяк, и как исправить? Строки 114-118.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#include <Eigen/Dense>
#include <Eigen/Sparse>
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
 
struct Element
{
    void CalculateStiffnessMatrix(const Eigen::Matrix3f& D, std::vector<Eigen::Triplet<float> >& triplets);
 
    Eigen::Matrix<float, 3, 6> B;
    int nodesIds[3];
};
 
struct Constraint
{
    enum Type
    {
        UX = 1 << 0,
        UY = 1 << 1,
        UXY = UX | UY
    };
    int node;
    Type type;
};
 
int                         nodesCount;
Eigen::VectorXf             nodesX;
Eigen::VectorXf             nodesY;
Eigen::VectorXf             loads;
std::vector< Element >      elements;
std::vector< Constraint >   constraints;
 
void Element::CalculateStiffnessMatrix(const Eigen::Matrix3f& D, std::vector<Eigen::Triplet<float> >& triplets)
{
    Eigen::Vector3f x, y;
    x << nodesX[nodesIds[0]], nodesX[nodesIds[1]], nodesX[nodesIds[2]];
    y << nodesY[nodesIds[0]], nodesY[nodesIds[1]], nodesY[nodesIds[2]];
    
    Eigen::Matrix3f C;
    C << Eigen::Vector3f(1.0f, 1.0f, 1.0f), x, y;
    
    Eigen::Matrix3f IC = C.inverse();
 
    for (int i = 0; i < 3; i++)
    {
        B(0, 2 * i + 0) = IC(1, i);
        B(0, 2 * i + 1) = 0.0f;
        B(1, 2 * i + 0) = 0.0f;
        B(1, 2 * i + 1) = IC(2, i);
        B(2, 2 * i + 0) = IC(2, i);
        B(2, 2 * i + 1) = IC(1, i);
    }
    Eigen::Matrix<float, 6, 6> K = B.transpose() * D * B * std::abs(C.determinant()) / 2.0f;
 
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            Eigen::Triplet<float> trplt11(2 * nodesIds[i] + 0, 2 * nodesIds[j] + 0, K(2 * i + 0, 2 * j + 0));
            Eigen::Triplet<float> trplt12(2 * nodesIds[i] + 0, 2 * nodesIds[j] + 1, K(2 * i + 0, 2 * j + 1));
            Eigen::Triplet<float> trplt21(2 * nodesIds[i] + 1, 2 * nodesIds[j] + 0, K(2 * i + 1, 2 * j + 0));
            Eigen::Triplet<float> trplt22(2 * nodesIds[i] + 1, 2 * nodesIds[j] + 1, K(2 * i + 1, 2 * j + 1));
 
            triplets.push_back(trplt11);
            triplets.push_back(trplt12);
            triplets.push_back(trplt21);
            triplets.push_back(trplt22);
        }
    }
}
 
void SetConstraints(Eigen::SparseMatrix<float>::InnerIterator& it, int index)
{
    if (it.row() == index || it.col() == index)
    {
        it.valueRef() = it.row() == it.col() ? 1.0f : 0.0f;
    }
}
 
void ApplyConstraints(Eigen::SparseMatrix<float>& K, const std::vector<Constraint>& constraints)
{
    std::vector<int> indicesToConstraint;
 
    for (std::vector<Constraint>::const_iterator it = constraints.begin(); it != constraints.end(); ++it)
    {
        if (it->type & Constraint::UX)
        {
            indicesToConstraint.push_back(2 * it->node + 0);
        }
        if (it->type & Constraint::UY)
        {
            indicesToConstraint.push_back(2 * it->node + 1);
        }
    }
 
    for (int k = 0; k < K.outerSize(); ++k)
    {
        for (Eigen::SparseMatrix<float>::InnerIterator it(K, k); it; ++it)
        {
            for (std::vector<int>::iterator idit = indicesToConstraint.begin(); idit != indicesToConstraint.end(); ++idit)
            {
                SetConstraints(it, *idit);
            }
        }
    }
}
 
int main(int argc, char *argv[])
{
    if ( argc != 3 )
    {
        std::cout<<"usage: "<< argv[0] <<" <input file> <output file>\n";
        return 1;
    }
    std::ifstream infile("test4.inp");
    std::ofstream outfile("test4.out");
    
    
    float poissonRatio, youngModulus;
    infile >> poissonRatio >> youngModulus;
 
    Eigen::Matrix3f D;
    D <<
        1.0f,           poissonRatio,   0.0f,
        poissonRatio,   1.0,            0.0f,
        0.0f,           0.0f,           (1.0f - poissonRatio) / 2.0f;
 
    D *= youngModulus / (1.0f - pow(poissonRatio, 2.0f));
 
    infile >> nodesCount;
    nodesX.resize(nodesCount);
    nodesY.resize(nodesCount);
 
    for (int i = 0; i < nodesCount; ++i)
    {
        infile >> nodesX[i] >> nodesY[i];
    }
 
    int elementCount;
    infile >> elementCount;
 
    for (int i = 0; i < elementCount; ++i)
    {
        Element element;
        infile >> element.nodesIds[0] >> element.nodesIds[1] >> element.nodesIds[2];
        elements.push_back(element);
    }
 
    int constraintCount;
    infile >> constraintCount;
 
    for (int i = 0; i < constraintCount; ++i)
    {
        Constraint constraint;
        int type;
        infile >> constraint.node >> type;
        constraint.type = static_cast<Constraint::Type>(type);
        constraints.push_back(constraint);
    }
 
    loads.resize(2 * nodesCount);
    loads.setZero();
 
    int loadsCount;
    infile >> loadsCount;
 
    for (int i = 0; i < loadsCount; ++i)
    {
        int node;
        float x, y;
        infile >> node >> x >> y;
        loads[2 * node + 0] = x;
        loads[2 * node + 1] = y;
    }
    
    std::vector<Eigen::Triplet<float> > triplets;
    for (std::vector<Element>::iterator it = elements.begin(); it != elements.end(); ++it)
    {
        it->CalculateStiffnessMatrix(D, triplets);
    }
 
    Eigen::SparseMatrix<float> globalK(2 * nodesCount, 2 * nodesCount);
    globalK.setFromTriplets(triplets.begin(), triplets.end());
 
    ApplyConstraints(globalK, constraints);
 
    Eigen::SimplicialLDLT<Eigen::SparseMatrix<float> > solver(globalK);
 
    Eigen::VectorXf displacements = solver.solve(loads);
 
    outfile << displacements << std::endl;
 
    for (std::vector<Element>::iterator it = elements.begin(); it != elements.end(); ++it)
    {
        Eigen::Matrix<float, 6, 1> delta;
        delta << displacements.segment<2>(2 * it->nodesIds[0]),
                 displacements.segment<2>(2 * it->nodesIds[1]),
                 displacements.segment<2>(2 * it->nodesIds[2]);
 
        Eigen::Vector3f sigma = D * it->B * delta;
        float sigma_mises = sqrt(sigma[0] * sigma[0] - sigma[0] * sigma[1] + sigma[1] * sigma[1] + 3.0f * sigma[2] * sigma[2]);
 
        outfile << sigma_mises << std::endl;
    }
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.12.2017, 16:35
Ответы с готовыми решениями:

Решение уравнения. Чтение из файла значений и запись результатов в файл
Здравствуйте!) Нужна программка, считывающая из файла не целые значения S11 через пробел, и подставляющая заданные значения S11 в уравнение...

Считывание данных из файла и запись результатов в файл
Здравствуйте. Необходимо переделать этот код: #include &lt;iostream&gt; using namespace std; /////////////////////////////////...

Чтение массива из файла, его преобразование и запись в другой файл
Всем привет. Есть вот такой код: #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;fstream&gt; #include &lt;string&gt; ...

2
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
24.12.2017, 16:50
так в 115 строке стоит return.
Вот программа и завершается, если Вы не передали в командной строке 2 параметра.
И зачем Вы вообще это написали, если имена из командной строки не используете!
0
0 / 0 / 0
Регистрация: 08.02.2016
Сообщений: 3
24.12.2017, 17:07  [ТС]
1)Какие параметры следует передавать?
2)Как передать программе входной файл через командную строку?
3)Зачем передавать ей выходной файл, который должен получиться? Или создать пустой файл с нужным именем и расширением?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.12.2017, 17:07
Помогаю со студенческими работами здесь

Реализовать запись в файл и чтение из файла данных, хранящихся в массиве объектов пользовательского типа
Друзья, нужен код записи и чтения данных с файла, записанных ранее, а точнее выполнить заполнение данными &quot;полей ввода&quot; ...

Замена букв в тексте из файла и запись результатов в файл
Здравствуйте, помогите, пожалуйста, дописать прогу - нужно, чтобы прога читала данные из файла, заменяла в нём букву t везде на букву x и...

Чтение из файла и запись в файл
всем привет! нужно написать программу, которая читает строку из файла. если слово содержит &quot;*&quot;, то его удалить, &quot;+&quot; -...

Чтение из файла и запись в файл
Доброго времени суток. Идея в чем: Пример входных данных из файла: 5 o 3 c 4 o 5 c 6 o 7

Запись в файл и чтение из файла
Всем привет. Кто может подсказать решение? Есть полученный заполненный массив. int A. Числа в нём от 0 до 17. Как его записать в файл...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru