Сафин А.Т. Расчет течения электролита в двумерной области

реклама
1
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
Федеральное государственное автономное образовательное учреждение
высшего профессионального образования
«Казанский (Приволжский) федеральный университет»
ИНСТИТУТ МАТЕМАТИКИ И МЕХАНИКИ ИМ.Н.И. ЛОБАЧЕВСКОГО
КАФЕДРА АЭРОГИДРОМЕХАНИКИ.
Направление: 010901.65 – механика
Специализация: механика жидкости, газа и плазмы.
ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА
(дипломная работа)
РАСЧЕТ ТЕЧЕНИЯ ЭЛЕКТРОЛИТА В ДВУМЕРНОЙ
ОБЛАСТИ ПРИ ЭХО
Работа завершена:
Студент 05-002 группы
«____»___________2015 г.
(А.Т.Сафин)
Работа допущена к защите:
Научный руководитель
Кандидат физико-математических наук, доцент
"___"_________ 2015 г.
________________
(Е.И Филатов)
Заведующий кафедрой
доктор физико-математических наук, профессор
"___"_________ 2015 г.
_________________
(А.Г. Егоров)
Казань- 2015
2
Содержание
Введение………………………………………………………………………3 стр.
Глава 1. Сущность метода ЭХО…………….………………………….……4 стр.
Глава 2. Физическая постановка задачи о течении электролита в МЭЗ…11 стр.
Глава 3. Основные допущения………. ………………………………….....13 стр.
Глава 4. Математическая постановка задачи……………………………....14 стр.
Глава 5. Метод решения системы уравнений………………..………….....16 стр.
Глава 6. Исследование устойчивости метода………………………………18 стр.
Глава 7. Численные примеры………………………………………………..19 стр.
7.1 Пример 1..…………………………………………………………..19 стр.
7.2. Пример 2………….……………………………………………..…24 стр.
Заключение……………………………………………………………………29стр.
Литература……………………………………………………………………30 стр.
Приложение. Программа расчета .……….…………………………………31 стр.
3
ВВЕДЕНИЕ
Развитие ряда современных отраслей техники в значительной мере зависит
от уровня развития машиностроения. Поскольку основным видом деятельности в
этой отрасли является металлообработка, требуется создание не только конструкционных материалов, но и принципиально новых методов их обработки, которые
позволят создавать новые материалы, обладающих высокой твердостью, прочностью, жаропрочностью и коррозионной стойкостью. К таким материалам относятся: высокопрочные и нержавеющие стали, жаропрочные сплавы, магнитные
сплавы. Обработка таких материалов традиционными методами резания сопряжена с большими трудностями, а иногда и невозможна. В таких случаях необходимо
использовать другие методы обработки, основанные на использовании химической, электрической и других видах энергии.
Целью настоящей работы является исследование гидродинамических процессов в межэлектродном зазоре и их влияние на процесс съёма металла с поверхности изготавливаемой детали.
4
Глава 1. СУЩНОСТЬ МЕТОДА ЭХО
В основе электрохимической обработки (ЭХО) металлов и сплавов лежит
принцип анодного растворения обрабатываемой заготовки в растворе электролита, прокачиваемого через межэлектродный зазор (МЭЗ) с большой скоростью. То
есть, ЭХО основана на способности металлов растворяться, в результате оксидных реакций, происходящих в среде электропроводного раствора – электролита,
под действием на него постоянного электрического тока. Такой химический
процесс растворения металлов называют электролизом. Электролиз протекает при
наличии источника питания электрическим током, электролита и двух металлических проводников, называемых электродами. При наложении напряжения на
электроды электрическое поле в электролите заставляет ионы двигаться; анионы
(отрицательно заряженные ионы) движутся по направлению к аноду, а катионы
(положительно заряженные ионы) – по направлению к катоду. Протекание тока
через ячейку от анода к катоду обеспечивается движением, как анионов, так и
катионов.
При осуществлении процесса имеются два электрода, из которых один - заготовка (анод), другой - инструмент (катод), электролит между ними, а также
источник питания. Совокупность двух электродов (анода, катода) и электролита
между ними называется электролитической ячейкой. Заготовка и инструмент не
касаются друг друга и отделены межэлектродным зазором (МЭЗ), заполненным
соответственно подобранной рабочей средой. Сущность электролиза состоит в
осуществлении за счет электрической энергии химических реакций – восстановление частиц на катоде и окисление на аноде.
Протекание тока в электролитической ячейке осуществляется посредством
движения ионов под действием приложенного внешнего электрического поля.
Жидкие растворы, проводящие электрический ток за счет ионной проводимости,
называются электролитами.
5
Применяют так называемые сильные электролиты, в которых все молекулы
растворенного вещества диссоциируют на анионы и катионы. Например, водный
раствор поваренной соли (𝑁𝑎𝐶𝑙) диссоциирует на 𝑁𝑎+ (катион) и 𝐶𝑙 − (анион).
Кроме этого сама вода содержит ион водорода 𝐻+ и гидроксила (𝑂𝐻)− . При
отсутствии внешнего электрического поля (если электроды разомкнуты) ионы
движутся в электролите хаотически и электрического тока в нем не наблюдается.
При этом на границе раздела твердой и жидкой фазы (металлического электрода и
электролита) образуются два электрически заряженных слоя: поверхностный слой
металла, заряженный положительно или отрицательно, и слой ионов, имеющий
противоположный заряд. Между этими слоями устанавливается определенный
потенциал, который называется равновесным. Этот потенциал измеряется относительно стандартного водородного электрода, потенциал которого при всех
условиях принимается равным нулю. Подключение электродов ячейки к источнику напряжения сдвигает их потенциалы от равновесных и вызывает протекание
электродных процессов.
Среди электролитов водный раствор хлористого натрия получил широкое
применение из-за его малой стоимости и длительной работоспособности, что
обеспечивается непрерывным восстановлением хлористого натрия в растворе.
Этот электролит рекомендуется для обработки материалов типа стали, никелевых
жаропрочных сталей, а с добавками едкого натрия — и для обработки твердых
сплавов. Это один из немногих видов энергетического воздействия на материал
заготовки, когда электрическая энергия работает напрямую без образования в
другие виды энергии.
В зависимости от химической природы электролита и электродов, а также
значения напряжения, на металлическом катоде обычно выделяется водород или
осаждается металл, на аноде происходит растворение металла, которое часто
сопровождается выделением кислорода. Это явление получило название электролиза. Основные его законы сформулировал в 1834 г. великий английский физик
М. Фарадей. По закону М. Фарадея: количество вещества, осажденного или
6
растворенного при электролизе, пропорционально количеству пропущенного
электричества:
𝑚 = 𝜀𝑄,
где m — масса материала, растворенного с анода, [г], 𝜀 — коэффициент пропорциональности (электрохимический эквивалент), Q — количество электричества,
пропущенное через электролит, [Кл ∙А∙с].
Масса металла, растворимого с анода получается меньше, чем по формуле
закона Фарадея, так как количество электричества тратится на: побочные реакции
на электродах, образование газов, вторичные реакции. Эти потери учитываются
коэффициентом 𝜂 — выходом по току. Он зависит от плотности тока, материала
заготовки, скорости прокачки, температуры и степени защелоченности электролита.
Коэффициентом выхода металла по току оценивают эффективность процессов ЭХО. Он представляет собой отношение фактического объема растворенного
металла при пропускании определенного количества электричества к расчетному
объему металла, который должен раствориться при пропускании того же количества электричества. Значение коэффициента выхода по току отражает характер
анодного растворения: активное или пассивное. При активном растворении
коэффициент выхода металла по току составляет обычно 0.5 - 1.0, при пассивном
растворении меньше 0.5.
Для нормального протекания электрохимических реакций необходимо
обеспечить интенсивный вынос продуктов обработки из межэлектродного
промежутка, поэтому электролит должен иметь определенную скорость. При
прокачке электролита также необходимо обеспечить равномерный поток, с целью
предотвращения перегрева и кипения в результате теплоты фазового превращения, а также появления на детали размывов, обусловленных застойными зонами.
Электролит может иметь ламинарный или турбулентный характер течения.
Вынос продуктов при турбулентном течении – быстрее. Однако расчет ламинарного потока значительно проще, поэтому в технологических расчетах принимают
течение ламинарным. Если электролит протекает со скоростью ниже некоторого
7
критического значения (менее 1-2 м/с), то он не успевает вынести из зазора все
продукты обработки, и скорость анодного растворения через некоторое время
после начала процесса снижается.
Средняя скорость электролита может изменяться в широких пределах (V=540 м/c). При таких скоростях число Рейнольдса Re может быть больше критического значения (Re≥2300). Тогда поток жидкости будет турбулентным, и рассчитанные скорости течения будут несколько завышенными.
Ещё одним из важнейших условий правильного ведения процесса является
поддержание заданной плотности тока. Скорость растворения находится в прямой
зависимости от плотности тока. Большинство материалов хорошо обрабатываются на установках, питаемых постоянным током.
С увеличением плотности тока потенциал анода возрастает таким образом,
что становится возможным выделение кислорода. Часть тока, протекающего
через ячейку, расходуется на выделение кислорода на аноде, и выход по току для
реакции растворения металла не составит 100%. Фактически перенапряжение
выделения кислорода с ростом плотности тока увеличивается так быстро, что
достигается потенциал разряда хлорид - ионов с образованием хлора. Таким
образом, скорость съёма металла увеличивается с возрастанием плотности тока
так.
Очевидно, что во время электрохимической обработки неизбежен нагрев
электролита. Хотя необходимо охлаждение электролита, существуют, тем не
менее, преимущества использования электролита с повышенной температурой.
С повышением температуры возрастает не только удельная электропроводность электролита, но ускоряются электродные реакции, и снижается перенапряжение, напряжение и, следовательно, энергия, необходимые для поддержания
данной плотности тока, уменьшаются с повышением температуры.
С повышением температуры увеличивается растворимость продуктов реакции, а давление, нужное для прокачки электролита через зазор с желаемой
скоростью, уменьшается. Последнее является следствием понижения вязкости
электролита с повышением температуры и также объясняет повышенную элек-
8
тропроводность. С повышением температуры электролита проводимость будет
возрастать при повышении температуры на каждый градус Цельсия. Однако
эффективная проводимость электролита будет уменьшаться вследствие выделения на катоде пузырьков водорода. На величину и распределение пузырьков
влияют условия протекания электролита, а также давление и температура в
зазоре. Увеличение давления электролита сверх атмосферного повышает температуру кипения электролита, уменьшает перенапряжение водорода на катоде и,
сжимая выделяющийся водород, уменьшает его объем. При повышенных давлениях пузырьки водорода, следовательно, занимают меньший объем в зазоре и
вытесняют меньше электролита, следовательно, могут поддерживаться большие
плотности тока.
Другие факторы, например образование осадков, обычно меньше влияют на
проводимость электролита. Все это приводит к тому, что зазор будет конусным,
становясь шире или уже в зависимости от того, что преобладает – влияние
температуры или пузырьков. Прокачивание электролита препятствует увеличению концентрации ионов у анода и дает возможность достичь больших плотностей тока.
Существует и другой фактор, который следует учитывать. Когда ток проходит через металлический или электролитический проводник, последний нагревается. Нагрев может привести к закипанию электролита, что вызовет неравномерное распределение тока и, следовательно, неравномерный съём металла. Поэтому
скорость потока электролита должна быть достаточной для предотвращения
повышения температуры электролита в зазоре до точки кипения.
Вся теплота при анодном растворении заготовки переходит в раствор, а
нагрев за счет гидравлических потерь пренебрежимо мал.
Таким образом, физические и химические свойства электролитов, важнейшими среди которых являются электропроводность и вязкость, оказывают
влияние на характер протекания и результаты процесса. От состава электролита
зависят его электропроводность и скорость растворения металла. Для получения
высоких технологических показателей процесса необходимо, чтобы:
9
а) в электролите не протекали вовсе или протекали в минимальном количестве побочные реакции, снижающие выход по току;
б) растворение заготовки происходило только в зоне обработки;
в) на всех участках обрабатываемой поверхности протекал расчетный ток.
Таких универсальных электролитов не существует, поэтому при подборе
состава электролита приходится в первую очередь учитывать те требования,
которые являются определяющими для выполнения операции.
При обработке состав электролита меняется. Потеря водорода может привести к понижению электропроводности электролита. Уменьшение количества
воды, как в результате испарения, так и с выделяющимся водородом вызывает
повышение концентрации раствора и влияет на его электропроводность и вязкость. Образование осадка может увеличить эффективную вязкость электролита и
снизить скорость анодного растворения.
Поглощение соли осадком снижает концентрацию раствора и может повлиять на его электропроводность. Ионы металла с анода переходят в раствор и
могут осаждаться на катоде. Эти изменения означают, что электролит имеет
определенный срок службы, который может быть ограничен вследствие необходимости: 1) поддерживать постоянную электропроводность для ускорения
процесса и обеспечения точности обработки; 2) предотвращать осаждение на
инструменте для обеспечения точности обработки; 3) избегать чрезмерных
осадков.
Нейтральные растворы, свободные от добавления примесей, меньше подвергаются загрязнению тяжелыми металлами, чем кислотные или электролиты
нейтрального типа, состоящие из нескольких компонентов.
Очистка электролитов необходима для удаления частиц, попавших в них
случайно или образовавшихся в процессе обработки. К таким частицам относятся
интерметаллические соединения, находящиеся в металле анода и переходящие в
электролит при его растворении, а также гидроокиси металла. Эти частицы могут
задерживаться в зазоре и даже перекрывать его. Если частицы электропроводные,
10
то возможны замыкания между анодом и катодом, следовательно, необходимо
защитить зазор от попадания в него твердых частиц.
На форму детали влияет величина этого зазора. Величина зазора между инструментом и деталью зависит от скоростей движения инструмента и растворения
материала детали, т. е. от величины тока. Поэтому способ контроля рабочего
зазора является одной из важных особенностей электрохимического процесса.
Форма детали определяется формой используемого катода-инструмента и относительными движениями инструмента и детали во время обработки, когда ток
пропускают через электролитическую ячейку между фасонным катодом и плоской деталью, распределение плотности тока на поверхности детали определяется
формой катода. Плотность тока будет самой большой там, где будет наименьшее
расстояние между инструментом и деталью, так, что и скорость съёма металла с
детали в этом месте будет максимальной. Если в процессе обработки катод
подается по направлению к детали, плотность тока по всей поверхности детали
выравнивается и ее поверхность формируется по форме катода.
Таким образом, под действием электрического тока происходит растворение материала электрода-заготовки, который в итоге приобретает форму, соответствующую профилю ЭИ (электрода-инструмента). В результате реакции, на
обрабатываемой поверхности заготовки образуются продукты обработки, в том
числе нерастворимые гидроксилы. Их концентрация в районе протекания анодного растворения в начальный момент превышает концентрацию в электролите.
Количество продуктов будет зависеть от скорости анодного растворения. Образовавшиеся продукты анодного растворения уносятся потоком электролита.
11
ГЛАВА 2. ФИЗИЧЕСКАЯ ПОСТАНОВКА ЗАДАЧИ О ТЕЧЕНИИ
ЭЛЕКТРОЛИТА В МЭЗ
Точность электрохимического метода обработки в значительной степени
определяется равномерностью съёма металла в разных местах межэлектродного
зазора. Съём металла, в свою очередь, определяется комплексом физических
характеристик процесса, в том числе локальными значениями гидродинамических
и электрических параметров электролита. В данной работе для исследования
влияния этих факторов на равномерность съёма по длине МЭЗ построена нестационарная модель процесса, основанная на одномерном приближении уравнений
гидродинамики и электрического поля.
Рассматриваются межэлектродные зазоры, поля физических величин, в которых можно считать одномерными, т. е. зависящими от одной пространственной
координаты. Это плоские поля для деталей типа пера турбинной лопатки. Считаем, что нижней границей является поверхность анода, форма ее меняется со
временем только за счет съёма металла, а верхней границей – поверхность катода.
Типичное значение ширины межэлектродного промежутка при ЭХО порядка 0.1
мм, тогда как радиус кривизны поверхности пера обычно превышает 100 мм.
Таким образом, типичные отношения ширины промежутка к кривизне менее 0.01.
Поэтому будем считать обрабатываемую поверхность плоской.
Для расчета съёма необходимо решать задачу о течении электролита в межэлектродном канале. Скорость растворения металла находится в прямой зависимости от плотности тока, которая зависит от электропроводности электролита,
электродных напряжений, а также величины межэлектродного зазора. Так как
электропроводность зависит от температуры и газонаполнения электролита, то
для расчета съёма металла необходимо рассматривать течение электролита в
рабочем зазоре.
12
Таким образом, учитывая связь всех этих процессов, необходимо решать
систему взаимосвязанных уравнений.
В системе подачи электролита в межэлектродный канал используют насосы.
На входе в межэлектродный канал в электролите растворяется окружающий
воздух, следовательно, газонаполнение имеет ненулевое значение и его рост
обеспечивается выделением водорода с катода. При этом, когда давление падает,
воздух выделяется из канала. В процессе обработки происходит также выделение
нерастворимых продуктов электролиза – шлама.
Таким образом, электролит является смесью нескольких фаз, скорости которых различны.
Так как невозможно решить задачу, учитывая все многообразие влияющих
факторов, необходимо сделать некоторые допущения.
13
Глава 3. ОСНОВНЫЕ ДОПУЩЕНИЯ
Численный анализ комплекса исследуемых процессов выполнен при следующих допущениях:
1. Электролит считается двухфазной смесью несжимаемой жидкости (водного
раствора соли) и газа (смеси воздуха и водорода, выделяющегося в процессе
реакции);
2. Для рассмотрения движения этой двухфазной смеси применяется метод расчета
течений сплошной среды;
3. Принимается модель Рахматуллина (используется модель односкоростного
течения);
4. Для газа принимается уравнение состояния Клапейрона:
𝑝ℎ =
0
𝑅0 𝜌ℎ
𝑇
µℎ
, где 𝑝ℎ − парциальное давление водорода, µℎ − молекулярная масса
водорода;
5. Плотность жидкой фазы постоянна: 𝜌𝑓 = 𝑐𝑜𝑛𝑠𝑡;
6. Давления газа и жидкости равны: 𝑝𝑔 = 𝑝𝑓 = 𝑝;
7. Для газовой фазы принимается: 𝑇𝑔 = 𝑇𝑓 = 𝑇;
8. Выход по току считается постоянным;
9. Кривизной канала пренебрегаем.
Для описания течения электролита используется система уравнений сохранения массы каждой фазы, энергии и импульса смеси.
14
Глава 4. МАТЕМАТИЧЕСКАЯ ПОСТАНОВКА ЗАДАЧИ
Будем считать, что поверхность детали меняется со временем только за счет
съема металла, тогда как поверхность катода может меняться по заданному
закону, например, вибрировать. Съем металла за малый промежуток времени Δ t :
Δh = ε an jη a Δt ρ met , где η a – выход по току анодной реакции, заданная функция
локальной плотности тока j, ε an и ρ met – электрохимический эквивалент и плотность обрабатываемого металла. Плотность тока j определяется выражением
j = κu c α h , где κ – электропроводность электролита, u c – разность потенциалов
на электродах,   1 u c u c - u c u c , Δu c и Δu a – потери напряжения на катоде
и аноде, заданные функции от j. Электропроводность определяется выражением:
   0 1 1.5 1 T  T0 , где  0 – электропроводность при температуре T0 , 
–газосодержание электролита,  – температурный коэффициент.
Так как  зависит от гидродинамических параметров электролита, то для
расчета съема металла необходимо рассматривать течение электролита в рабочем
зазоре. Принимая во внимание, что ширина зазора много меньше его длины,
можно осреднить гидродинамические уравнения в направлении, нормальном к
поверхности детали. Электролит будем считать двухфазной смесью несжимаемой
жидкости (водный раствор соли) и газа (смесь воздуха и водорода, выделяющегося в процессе реакции). Будем считать, что часть объема 1   занята жидкостью, а часть  – газом. Тогда уравнения сохранения массы для каждого компонента можно записать в виде :


 f    ( f v x )  ( f v y )  j a  a ,
t
x
y
(1)



 h    h w x  
 h w y  j h  h ,
t
x
y
(2)



 a    a w x  
a w y  0 ,
t
x
y
(3)




15
где  f  h1   f 0 ,  h  hh 0 ,  a  ha 0 ;  f 0 ,  h 0 ,  a 0 – плотность жидкости,
водорода и воздуха, v x и v y – компоненты скорости жидкости, w x and w y –
компоненты скорости газа,  h – электрохимический эквивалент и выход по току
для водорода в катодной реакции.
Следуя модели Х.А.Рахматуллина , будем считать, что давления газа и жидкости равны: p g  p f  p . В этом случае, складывая уравнения импульсов для фаз
и пренебрегая отношением  2 / 1 по сравнению с единицей, получим уравнение
сохранения импульса для смеси в целом в виде







1v   1v x v  
1v y v   hp   f  j a  a v   h  h w  , ( 4 )
t
x
y


где 1   f , v – единая скорость смеси,  f – напряжение трения на электродах,


 f   f 1  1v 2 / 8 ,  fx   f v x / v ,  fy   f v y / v ,  f – коэффициент трения .
В правой части уравнения энергии для жидкой фазы оставляем только джоулев нагрев Q :



Q
1Tf   1v x Tf  
1v y Tf 
.
(5)
t
x
y
cp


Для газовой фазы принимаем: Tg = Tf = T .
Уравнение состояния для воздуха p a  R 0  a 0 T /  a , где p a – парциальное
давление воздуха, R 0 – универсальная газовая постоянная,
электролита, общая для всех компонент,  a
T – температура
– молекулярная масса воздуха.
Уравнение состояния водорода: p h  R 0  h 0 T /  h , где p h – парциальное давление водорода,  h – молекулярная масса водорода. Давление смеси определяется
законом Дальтона: p  p a  p h  R 0  a 0 T /  e , где 1/  e  (1/  a   h 0 /( a 0  h )) –
фактор сжимаемости. Уравнение состояния жидкой фазы:  f =const.
16
Глава 5. МЕТОД РЕШЕНИЯ СИСТЕМЫ УРАВНЕНИЙ
Для численного решения уравнений и систем гиперболического типа в
вычислительной
практике
наиболее
распространены
явные
двухслойные
разностные схемы.
Система уравнений (1) - (4) решалась численно конечно-разностным двухшаговым методом Мак - Кормака.
Предиктор:
𝑛
𝑢̃𝑖𝑛+1 − 𝑢𝑖𝑛 𝑓𝑖+1
− 𝑓𝑖𝑛
+
= 0,
∆𝑡
∆𝑥
Корректор:
𝑛+1
𝑢̂𝑖𝑛+1 − 𝑢𝑖𝑛 𝑓̃𝑖𝑛+1 − 𝑓̃𝑖−1
+
= 0,
∆𝑡
∆𝑥
𝑢𝑖𝑛+1
𝑢̃𝑖𝑛+1 + 𝑢̂𝑖𝑛+1
=
2
Первоначально (предиктор) находится оценка 𝑢̃𝑖𝑛+1 величины 𝑢 на (𝑛 + 1)
шаге по времени, а потом (корректор) определяется ее окончательное значение.
Метод Мак - Кормака обладает тем неоспоримым преимуществом, что не
требует вычисления значений функции в полу целых узлах, что делает данный
метод удобным для решения нелинейных уравнений в частных производных. В
предикторе использовались разности вперед, а в корректоре – разности назад.
Направления аппроксимирующих производную
𝜕
𝜕𝑥
разностей в предикторе и
корректоре могут быть изменены на противоположные. Для системы уравнений
(1) - (4) метод Мак - Кормака дает следующие РС:
Предиктор (шаблон на Рис. 1а):
̃)𝑛+1 = (𝜌 )𝑛 − ∆𝑡 [(𝜌 𝑣)𝑛 − (𝜌 𝑣)𝑛 ]
(𝜌
𝑓 𝑖
𝑓 𝑖
𝑓
𝑓
∆𝑥
𝑖+1
𝑖
𝑛+1
̃0 )
(ℎ𝜑𝜌
ℎ
𝑖
= (ℎ𝜑𝜌ℎ0 )𝑛𝑖 −
∆𝑡
∆𝑥
[(ℎ𝜑𝜌ℎ0 𝑣)𝑛𝑖+1 − (ℎ𝜑𝜌ℎ0 𝑣)𝑛𝑖 ] + 𝑗𝑖 𝜀ℎ
(1)
(2)
17
𝑛+1
𝑛
𝑛
𝑛
∆𝑡
̃
𝑛
𝑣)
= (𝜌𝑓 𝑣) − [(𝜌𝑓 𝑣 2 ) − (𝜌𝑓 𝑣 2 ) + ℎ(𝑝𝑖+1
− 𝑝𝑖𝑛 )] − 𝜏𝑓 ∆𝑡
(𝜌
𝑓
𝑖
𝑖
∆𝑥
𝑖+1
𝑖
(3)
𝑛+1
𝑛
𝑛
𝑛
∆𝑡
𝑄
̃
𝑇)
= (𝜌𝑓 𝑇) − [(𝜌𝑓 𝑣𝑇) − (𝜌𝑓 𝑣𝑇) ] + ∆𝑡
(𝜌
𝑓
𝑖
𝑖
∆𝑥
𝑖+1
𝑖
𝑐
(4)
𝑝
Корректор (шаблон на Рис. 1б):
𝑛+1
(𝜌𝑓 )𝑖
𝑛
𝑛+1
̃)
= [(𝜌𝑓 ) + (𝜌
𝑓 𝑖
2
𝑖
1
−
𝑛+1
𝑛+1
̃
̃
𝑣)
−
𝑣)
((𝜌
(𝜌
)]
𝑓
𝑓
∆𝑥
𝑖
𝑖−1
∆𝑡
𝑛+1
1
̃0 )
(ℎ𝜑𝜌ℎ0 )𝑛+1
= [(ℎ𝜑𝜌ℎ0 )𝑛𝑖 + (ℎ𝜑𝜌
𝑖
ℎ
2
𝑖
−
𝑛+1
∆𝑡
̃0 𝑣)
((ℎ𝜑𝜌
ℎ
∆𝑥
𝑖
(1)
𝑛+1
̃0 𝑣)
− (ℎ𝜑𝜌
ℎ
𝑖−1
)+
∆𝑡𝑗𝑖 𝜀ℎ ] (2)
𝑛+1
(𝜌𝑓 𝑣)𝑖
𝑛+1
𝑛+1
𝑛+1
𝑛
1
∆𝑡
̃
̃
̃
𝑛+1
2)
2)
= [(𝜌𝑓 𝑣) + (𝜌
𝑣)
−
𝑣
−
𝑣
+ ℎ (𝑝̃
−
((𝜌
(𝜌
𝑓
𝑓
𝑓
𝑖
2
𝑖
𝑖
∆𝑥
𝑖
𝑖−1
𝑛+1
𝑝̃
𝑖−1 )) − 𝜏𝑓 ∆𝑡] (3)
𝑛+1
(𝜌𝑓 𝑇)𝑖
𝑛+1
𝑛+1
𝑛+1
𝑛
1
∆𝑡
𝑄
̃
̃
̃
= [(𝜌𝑓 𝑇) + (𝜌
𝑇)
−
𝑣𝑇)
−
𝑣𝑇)
+ ∆𝑡] (4)
((𝜌
(𝜌
)
𝑓
𝑓
𝑓
2
𝑖
𝑖
∆𝑥
𝑖
𝑖−1
𝑐
Рис.1 а
𝑝
Рис.2 б
18
Глава 6. ИССЛЕДОВАНИЕ УСТОЙЧИВОСТИ МЕТОДА
При приближенном решении уравнений с частными производными на первый
план выдвигается вопрос об устойчивости разностных аппроксимаций.
Используемый в данной работе метод Мак – Кормака обладает вторым порядком точности с погрешностью аппроксимации 𝑂(∆𝑡 2 , ∆𝑥 2 ). Условием устойчивости является условие КФЛ:
с
𝜏
≤1
ℎ
где 𝜏 - шаг по времени, ℎ - шаг по оси х.
Были произведены расчеты при различных шагах по времени и по пространству. Достаточная точность была получена при разбиении с шагом 1⁄20.
При тестировании наибольшим значением шага по времени стало 𝜏 =
0.00004. Если превысить данное значение, решение начинает “разваливаться”.
Таким образом, константа с в условии Куранта, рассчитанное для различных
наборов параметров, принимает значение:
с≤
ℎ
𝜏
=
где ℎ =
0.002631578947
0.00004
𝑙𝑒𝑛𝑔𝑡ℎ
𝑚𝑘 −1
= 65.789473675 ,
, 𝑙𝑒𝑛𝑔𝑡ℎ = 0.05м, 𝑚𝑘 = 20.
Результаты исследования работы метода приведены на графиках.
19
Глава 7. Численные примеры
Пример 1.
Система была преобразована к безразмерным переменным и была решена
конечно-разностным методом с помощью явной схемы Мак-Кормака . Была
составлена программа, на персональном компьютере на программе С++. Текс
программа приведена ниже в приложении. Имея в виду компрессорные лопатки мы представляем здесь результаты расчета для рабочей зоны между
двумя прямоугольными пластинами 60мм * 30мм с постоянным начальным
зазором h = 0,25 мм. Входные значения давления электролита, температуры,
содержания газа, были даны. В других сторонах рабочее давление на выходе
из под площадки было равно давлению окружающей среды, другие параметры были свободны.
Электролит входил с одной короткой стороны прямоугольной области и
выходит через три другие стороны. Давление на входной стороне в этих расчетах было в два раза больше, чем на других сторонах.
Физические константы взяты в следующем виде:  f =1000кг/м,
 0 =11ом-1м-1, uc =10в,  a =0.29*10-6
 m et =7600кг/м
Tm =273K,
R 0=
кг/а,
c p =3760
,
Дж/K, 𝑅ℎ =4125 Дж/кг*K ,
 0 =0.001кг/мс,  h =1.04*10- 8
7.31 Дж/моль*K.
Рис. 1. Схема входа и выхода электролита.
кг/а,
20
Рис. 2. Начальное поле скоростей VX
Рис. 3. Начальное поле скоростей VY
21
Рис.4. Изменение оси X по времени.
Рис.5. Изменение оси Y по времени.
22
Рис.6. Изменение насыщения по времени.
Рис.7. Изменение температуры по времени.
23
Рис.8.Распределение съема металла .
24
Пример 2.
Система была преобразована к безразмерным переменным и была решена
конечно-разностным методом с помощью явной схемы Мак-Кормака . Была
составлена программа, на персональном компьютере на программе С++. Текс
программы приведена ниже в приложении. Имея в виду компрессорные лопатки мы представляем здесь результаты расчета для рабочей зоны между
двумя прямоугольными пластинами 30мм * 60мм с постоянным начальным
зазором h = 0,25 мм. Входные значения давления электролита, температуры,
содержания газа, были даны. В других сторонах рабочее давление на выходе
из под площадки было равно давлению окружающей среды, другие параметры были свободны.
Электролит входил с одной короткой стороны прямоугольной области и
выходит через три другие стороны. Давление на входной стороне в этих расчетах было в два раза больше, чем на других сторонах.
Физические константы взяты в следующем виде:  f =1000кг/м,
 0 =11ом-1м-1, uc =10в,  a =0.29*10-6
 m et =7600кг/м
Tm =273K,
R 0=
кг/а,
c p =3760
,
Дж/K, 𝑅ℎ =4125 Дж/кг*K ,
 0 =0.001кг/мс,  h =1.04*10- 8
7.31 Дж/моль*K.
Рис. 9. Схема входа и выхода электролита.
кг/а,
25
Рис. 10. Начальное поле скоростей VX
Рис. 11. Начальное поле скоростей VY
26
Рис.12. Изменение оси X по времени.
Рис.13. Изменение оси Y по времени.
27
Рис.14. Изменение насыщения по времени
Рис.15. Изменение температуры по времени.
28
Рис.16. Распределение съема металла.
29
ЗАКЛЮЧЕНИЕ
Таким образом, было проведено исследование гидродинамических процессов,
происходящих в межэлектродном зазоре при электрохимической обработке.
Путём численного решения взаимосвязанных уравнений, описывающих течение электролита в межэлектродном зазоре, было получено распределение физических величин: давления, компонент скорости, газонаполнения и температуры
элетролита по площади канала. Было проведено исследование влияния различных параметров на равномерность съёма металла. Среди рассмотренных форм
межэлектродного зазора, определены наиболее выгодные. Результаты представленные в виде графиков хорошо согласуются с теоретическим представлением и
со здравым смыслом. Использованный для расчета метод позволяет достаточно
эффективно решать задачи оптимизации процесса обработки деталий типа
турбинных лапаток.
30
ЛИТЕРАТУРА
[1]. Филатов Е.И. Моделирование течения электролита при ЭХО на базе уравнений Навье-Стокса. - Набережные Челны: Камская государственная инженерноэкономическая академия, 2010. - 292с.
[2]. Флетчер К. Вычислительные методы в динамике жидкостей. – Москва: Мир,
1991. - Т. 2 -172 с.
[3]. Байсупов И.А. Электрохимическая обработка металлов. – Москва: Высш.
шк., 1988. – 184 с.
[4]. Davydov, A.,D., and Kozak, J.: High Rate Electrochemical Shaping.
- Moscow: Nauka, 1990.
[5]. Филатов Е.И Численное исследование влияния проницаемости границ на
течение электролита при ЭХО. Материалы Всероссийской научной конференции
«Краевые задачи и их приложения» - Казань, 1999, с. 201-205.
[6]. Каримов А.Х., Клоков В.В., Филатов Е.И. Методы расчета электрохимического формообразования. – Казань: изд. Казанского университета, 1990. – 385 с.
[7]. Андерсон Д., Таннехилл Дж., Плетчер Р. Вычислительная гидромеханика и
теплообмен.- Москва: Мир, 1990. Т. 1-124-125 с.
[8]. Багоцкий В.С. Основы электрохимии. – Москва: Химия, 1988. – 400с.
[9]. Р.И.Нигматуллин. Динамика многофазных сред. Часть.1. – М.: Наука, 1987.
[10]. Флетчер К. Вычислительные методы в динамике жидкостей: В 2-х т.: Т.2:
Пер. с англ. – М.: Мир, 1992. – 552с., ил.
[11]. В.М. Волгин, Моделирование течений газожидкостных сред при электрохимическом формообразоваании. in: Сб. тр. научн.-техн. конф. Современная
электротехнология в промышленности центра России, Тула, Росиия, 27-31, 1998.
[12]. Р.И. Нигматуллин. Механика сплошной среды. Москва «ГЭОТАР-Медиа»
2014. 640 стр.
[13]. Л.М. Котляр, Н.М. Миназетдинов. Моделирование процесса электрохимической обработки металла для технологической подготовки производства. Москва.
Academia. 2005. 200 стр.
31
Программа расчета
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//#include <math.hpp>
#include <math.h>
#include <cmath>
//--------------------------------------------------------------------------#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
const double lmas
= 1.0;
const double vmas
= 1.0;
const double umas
= 10.0;
const double bx
= -0.5;
const double by
= -0.5;
const double cycle
= 1.0;
const double b1
= 0.9;
const double b2
= 0.9;
const double row
= 1080.0;
const double pa
= 100000.0;
const double gyi
= -9.81;
const double kap0
= 11.0;
const double epsan
= 0.29e-6;
const double cp
const double tem0
const double atu
= 3760.0;
= 273.0;
= 0.0001;
const double romet
= 7600.0;
const double mu0
= 0.001;
const double rgas
const double epsgas
const double etag
const double xi
= 4150.0;
= 1.04e-8;
= 0.2;
= 0.025;
const double qan
= 0.0;
const double qk
= 0.0;
const double em
= 0.019;
const double kmu
= 0.0;
const double t0
= 287.0;
const double pi
= 3.1415;
const double vymax
= 0.50;
unsigned short flag
= 2.0;
bool signflag
= true;
bool sinhroflag
= true;
32
const int dimqtime
= 40;
template<class T> T sqr( const T& x ){ return x*x; }
void TForm1::predictor( const int& k )
{
int li, lj;
if (signflag)
{
li = 1;
lj = 1;
} else
{
li = -1;
lj = -1;
}
if (!sinhroflag)
lj = -li;
/* complexes a are calculaled */
for (int i = 2; i <= nx - 1; i++)
{ /* cycle 2 */
for (int j = 2; j <= ny - 1; j++)
{ /* cycle 21 */
mu = mu0 * exp(-em * (tem[i][j] * tem0 - t0) + 0.0001) * (1.0 + kmu * fi[i][j]);
vel = (sqrt(vx[i][j] * vx[i][j] + vy[i][j] * vy[i][j]));
re = acat[i][j] * atu * row * (1.0 - fi[i][j]) * vel * vmas / mu;
if (re < 2300.0) la = 64.0 / re;
else la = 0.0032 + 0.221 / exp(0.237 * log(re));
qtan = (1.5 * 0.125 * (1.0 - fi[i][j]) * la * vel * vel * lmas / atu);
taux = qtan * vx[i][j] / vel; tauy = qtan * vy[i][j] / vel;
kap = ((1.0 - fi[i][j]) * sqrt(1.0 - fi[i][j]) * (1.0 + xi * (tem[i][j] - 1.0) * tem0));
current[i][j] = kap * ut / acat[i][j];
qu = current[i][j] * ut;
eta = 1.0;
/* smoothing */
if (1.0 < (i + li))
if ((i + li) < nx)
if (1 < (j + lj))
if ((j + lj) < ny)
{
dvxdx = (vx[i + 1][j] - vx[i - 1][j]) / dx;
avxx = (1 - fi[i][j]) * sqr(b1 * dx) * abs(dvxdx);
dvxdxli = (vx[i + li + 1][j] - vx[i + li - 1][j]) / dx;
avxxli = (1 - fi[i + li][j]) * sqr(b1 * dx) * abs(dvxdxli);
dvxdy = (vx[i][j + 1] - vx[i][j - 1]) / dy;
avxy = (1 - fi[i][j]) * sqr(b1 * dx) * abs(dvxdy);
dvxdylj = (vx[i][j + lj + 1] - vx[i][j + lj - 1]) / dy;
avxylj = (1 - fi[i][j + lj]) * sqr(b1 * dx) * abs(dvxdylj);
33
dvydx = (vy[i + 1][j] - vy[i - 1][j]) / dx;
avyx = (1 - fi[i][j]) * sqr(b1 * dx) * abs(dvydx);
dvydxli = (vy[i + li + 1][j] - vy[i + li - 1][j]) / dx;
avyxli = (1 - fi[i + li][j]) * sqr(b1 * dx) * abs(dvydxli);
dvydy = (vy[i][j + 1] - vy[i][j - 1]) / dy;
avyy = (1 - fi[i][j]) * sqr(b1 * dx) * abs(dvydy);
dvydylj = (vy[i][j + lj + 1] - vy[i][j + lj - 1]) / dy;
avyylj = (1 - fi[i][j + lj]) * sqr(b1 * dx) * abs(dvydylj);
} else
{
avxx = 0.0;
avxy = 0.0;
avyx = 0.0;
avyy = 0.0;
avxxli = 0.0;
avxylj = 0.0;
avyxli = 0.0;
avyylj = 0.0;
}
z1 = dt * epsg * etag * current[i][j] * m1;
a1[i][j][1] = a1[i][j][2] + li * tx * (a1[i][j][2] * (1.0 - bx) * vx[i][j] - a1[i + li][j][2] * (1.0 - bx) * vx[i + li][j]) + lj * ty *
(a1[i][j][2] * (1.0 - by) * vy[i][j] - a1[i][j + lj][2] * (1.0 - by) * vy[i][j + lj]) + z1;
z2 = dt * (eta - epsg * etag) * current[i][j] * m2;
a2[i][j][1] = a2[i][j][2] + li * tx * (a2[i][j][2] * vx[i][j] - a2[i + li][j][2] * vx[i + li][j]) + lj * ty * (a2[i][j][2] * vy[i][j] - a2[i][j +
lj][2] * vy[i][j + lj]) + z2;
z3 = dt * (-taux + dhdx[i][j] * pres[i][j] * pmas);
a3[i][j][1] = a3[i][j][2] + li * tx * ((a3[i][j][2] * vx[i][j] + pres[i][j] * acat[i][j] * pmas - avxx) - (a3[i + li][j][2] * vx[i + li][j] +
pres[i + li][j] * acat[i + li][j] * pmas - avxxli)) + lj * ty * (a3[i][j][2] * vy[i][j] - avxy - a3[i][j + lj][2] * vy[i][j + lj] - avxylj) + z3;
z4 = dt * (-tauy + dhdy[i][j] * pres[i][j] * pmas + (1 - fi[i][j]) * acat[i][j] * gy);
a4[i][j][1] = a4[i][j][2] + li * tx * (a4[i][j][2] * vx[i][j] - avyx - a4[i + li][j][2] * vx[i + li][j]) - avyxli + lj * ty * ((a4[i][j][2] *
vy[i][j] + pres[i][j] * pmas * acat[i][j]) - avyy - (a4[i][j + lj][2] * vy[i][j+lj] + pmas * pres[i][j+lj] * acat[i][j+lj]) - avyylj) + z4;
z5 = dt * (qan + qk + qu) * m4;
a5[i][j][1] = a5[i][j][2] + li * tx * (a5[i][j][2] * vx[i][j] - a5[i + li][j][2] * vx[i + li][j]) + lj * ty * (a5[i][j][2] * vy[i][j] - a5[i][j +
lj][2] * vy[i][j + lj]) + z5;
}
}
prim(1);
bound(1);
}
void TForm1::corrector( const int& k )
{
int li, lj;
if (signflag)
{
li = 1;
34
lj = 1;
} else
{
li = -1;
lj = -1;
}
if (!sinhroflag)
lj = -li;
for (int i = 2; i <= nx - 1; i++)
{
for (int j = 2; j <= ny - 1; j++)
{
mu = mu0 * exp(-em * (tem[i][j] * tem0 - t0) + 0.0001) * (1.0 + kmu * fi[i][j]);
vel = (sqrt(vx[i][j] * vx[i][j] + vy[i][j] * vy[i][j]));
re = acat[i][j] * atu * row * (1.0 - fi[i][j]) * vel * vmas / mu;
if (re < 2300.0)
la = 64.0 / re;
else
la = 0.0032 + 0.221 / exp(0.237 * log(re));
qtan = (1.5 * 0.125 * (1.0 - fi[i][j]) * la * vel * vel * lmas / atu);
taux = qtan * vx[i][j] / vel; tauy = qtan * vy[i][j] / vel;
kap = ((1.0 - fi[i][j]) * sqrt(1.0 - fi[i][j]) * (1.0 + xi * (tem[i][j] - 1.0) * tem0));
current[i][j] = kap * ut / acat[i][j];
qu = current[i][j] * ut;
eta = 1.0;
/* smoothing */
if (1.0 < (i - li))
if ((i - li) < nx)
if (1 < (j - lj))
if ((j - lj) < ny)
{
dvxdx = (vx[i + 1][j] - vx[i - 1][j]) / dx;
avxx = (1 - fi[i][j]) * sqr(b2 * dx) * abs(dvxdx);
dvxdxli = (vx[i - li + 1][j] - vx[i - li - 1][j]) / dx;
avxxli = (1 - fi[i - li][j]) * sqr(b2 * dx) * abs(dvxdxli);
dvxdy = (vx[i][j + 1] - vx[i][j - 1]) / dy;
avxy = (1 - fi[i][j]) * sqr(b2 * dx) * abs(dvxdy);
dvxdylj = (vx[i][j - lj + 1] - vx[i][j - lj - 1]) / dy;
avxylj = (1 - fi[i][j - lj]) * sqr(b2 * dx) * abs(dvxdylj);
dvydx = (vy[i + 1][j] - vy[i - 1][j]) / dx;
avyx = (1 - fi[i][j]) * sqr(b2 * dx) * abs(dvydx);
dvydxli = (vy[i - li + 1][j] - vy[i - li - 1][j]) / dx;
avyxli = (1 - fi[i - li][j]) * sqr(b2 * dx) * abs(dvydxli);
dvydy = (vy[i][j + 1] - vy[i][j - 1]) / dy;
35
avyy = (1 - fi[i][j]) * sqr(b2 * dx) * abs(dvydy);
dvydylj = (vy[i][j - lj + 1] - vy[i][j - lj - 1]) / dy;
avyylj = (1 - fi[i][j - lj]) * sqr(b2 * dx) * abs(dvydylj);
} else
{
avxx = 0.0;
avxy = 0.0;
avyx = 0.0;
avyy = 0.0;
avxxli = 0.0;
avxylj = 0.0;
avyxli = 0.0;
avyylj = 0.0;
}
z1 = dt * epsg * etag * current[i][j] * m1;
a1[i][j][2] = 0.5 * (a1[i][j][2] + a1[i][j][1] + li * tx * (a1[i - li][j][1] * (1.0 - bx) * vx[i - li][j] - a1[i][j][1] * (1.0 - bx) * vx[i][j]) +
lj * ty * (a1[i][j - lj][1] * (1.0 - by) * vy[i][j - lj] - a1[i][j][1] * (1.0 - by) * vy[i][j]) )+z1;
z2 = dt * (eta - epsg * etag) * current[i][j] * m2;
a2[i][j][2] = 0.5 * (a2[i][j][2] + a2[i][j][1] + li * tx * (a2[i - li][j][1] * vx[i - li][j] - a2[i][j][1] * vx[i][j]) + lj * ty * (a2[i][j - lj][1] *
vy[i][j - lj] - a2[i][j][1] * vy[i][j])) + z2;
z3 = dt * (-taux + dhdx[i][j] * pres[i][j] * pmas);
a3[i][j][2] = 0.5 * (a3[i][j][1] + a3[i][j][2] + li * tx * ((a3[i - li][j][1] * vx[i - li][j] + pres[i - li][j] * acat[i - li][j] * pmas) - avxxli (a3[i][j][1] * vx[i][j] + pres[i][j] * acat[i][j] * pmas) - avxx) + lj * ty * (a3[i][j-lj][1] * vy[i][j-lj] - avxylj - a3[i][j][1] * vy[i][j] avxy))+z3;
z4 = dt * (-tauy + dhdy[i][j] * pres[i][j] * pmas + (1 - fi[i][j]) * acat[i][j] * gy);
a4[i][j][2] = 0.5 * (a4[i][j][1] + a4[i][j][2] + li * tx * (a4[i - li][j][1] * vx[i - li][j] - avyxli - a4[i][j][1] * vx[i][j] - avyx) + lj * ty *
((a4[i][j - lj][1] * vy[i][j - lj] + pres[i][j - lj] * acat[i][j-lj] * pmas-avyylj) - ( a4[i][j][1] * vy[i][j] + pres[i][j] * acat[i][j] * pmasavyy)))+z4;
z5 = dt * (qan + qk + qu) * m4;
a5[i][j][2] = 0.5 * (a5[i][j][1] + a5[i][j][2] + li * tx * (a5[i - li][j][1] * vx[i - li][j] - a5[i][j][1] * vx[i][j]) + lj * ty * (a5[i][j - lj][1] *
vy[i][j - lj] - a5[i][j][1] * vy[i][j])) + z5;
}
}
prim(2);
bound(2);
}
void TForm1::prim( const int& k )
{
for (int i = 2; i <= nx - 1; i++)
{
for (int j = 2; j <= ny - 1; j++)
{
fi[i][j] = 1.0 - a2[i][j][k] / acat[i][j];
/*ShowMessage(FloatToStr(a3[i][j][k]));
ShowMessage(FloatToStr(a2[i][j][k]));
36
ShowMessage(FloatToStr(a3[i][j][k] / a2[i][j][k]));*/
//Caption = a3[i][j][k];//FloatToStr(1.0 * ((1.0 * a3[i][j][k]) / (1.0 * a2[i][j][k])));
vx[i][j] = a3[i][j][k] / a2[i][j][k];
vy[i][j] = a4[i][j][k] / a2[i][j][k];
tem[i][j] = a5[i][j][k] / a2[i][j][k];
pres[i][j] = a1[i][j][k] * tem[i][j] / (fi[i][j] * acat[i][j]);
}
}
}
void TForm1::bound( const int& k )
{
for (int i = 2; i <= nx - 1; i++)
{
vx[i][1] = 2.0 * vx[i][2] - vx[i][3];
vy[i][1] = 2.0 * vy[i][2] - vy[i][3];
fi[i][1] = 2.0 * fi[i][2] - fi[i][3];
tem[i][1] = 2.0 * tem[i][2] - tem[i][3];
pres[i][1] = pab;
kap = ((1.0 - fi[i][1]) * sqrt(1.0 - fi[i][1]) * (1.0 + xi * (tem[i][1] - 1.0) * tem0));
current[i][1] = kap * ut / acat[i][1];
a1[i][1][k] = fi[i][1] * pres[i][1] * acat[i][1] / tem[i][1];
a2[i][1][k] = (1.0 - fi[i][1]) * acat[i][1];
a3[i][1][k] = a2[i][1][k] * vx[i][1];
a4[i][1][k] = a2[i][1][k] * vy[i][1];
a5[i][1][k] = a2[i][1][k] * tem[i][1];
}
for (int i = 2; i <= nx - 1; i++)
{
vx[i][ny] = 2.0 * vx[i][ny - 1] - vx[i][ny - 2];
vy[i][ny] = 2.0 * vy[i][ny - 1] - vy[i][ny - 2];
fi[i][ny] = 2.0 * fi[i][ny - 1] - fi[i][ny - 2];
tem[i][ny] = 2.0 * tem[i][ny - 1] - tem[i][ny - 2];
pres[i][ny] = pcd;
kap = ((1.0 - fi[i][ny]) * sqrt(1.0 - fi[i][ny]) * (1.0 + xi * (tem[i][ny] - 1.0) * tem0));
current[i][ny] = kap * ut / acat[i][ny];
a1[i][ny][k] = fi[i][ny] * pres[i][ny] * acat[i][ny] / tem[i][ny];
a2[i][ny][k] = (1.0 - fi[i][ny]) * acat[i][ny];
a3[i][ny][k] = a2[i][ny][k] * vx[i][ny];
a4[i][ny][k] = a2[i][ny][k] * vy[i][ny];
a5[i][ny][k] = a2[i][ny][k] * tem[i][ny];
}
for (int j = 1; j <= ny; j++)
{
vx[1][j] = 2 * vx[2][j] - vx[3][j];
vy[1][j] = 0.0;
fi[1][j] = fiin;
37
tem[1][j] = temi;
pres[1][j] = presi;
kap = ((1.0 - fi[1][j]) * sqrt(1.0 - fi[1][j]) * (1.0 + xi * (tem[1][j] - 1.0) * tem0));
current[1][j] = kap * ut / acat[1][j];
a1[1][j][k] = fi[1][j] * pres[1][j] * acat[1][j] / tem[1][j];
a2[1][j][k] = (1.0 - fi[1][j]) * acat[1][j];
a3[1][j][k] = a2[1][j][k] * vx[1][j];
a4[1][j][k] = a2[1][j][k] * vy[1][j];
a5[1][j][k] = a2[1][j][k] * tem[1][j];
}
for (int j = 1; j <= ny; j++)
{
vx[nx][j] = vx[nx - 1][j];
vy[nx][j] = vy[nx - 1][j];
fi[nx][j] = fi[nx - 1][j];
tem[nx][j] = tem[nx - 1][j];
pres[nx][j] = presend;
kap = ((1.0 - fi[nx][j]) * sqrt(1.0 - fi[nx][j]) * (1.0 + xi * (tem[nx][j] - 1.0) * tem0));
current[nx][j] = kap * ut / acat[nx][j];
a1[nx][j][k] = fi[nx][j] * pres[nx][j] * acat[nx][j] / tem[nx][j];
a2[nx][j][k] = (1.0 - fi[nx][j]) * acat[nx][j];
a3[nx][j][k] = a2[nx][j][k] * vx[nx][j];
a4[nx][j][k] = a2[nx][j][k] * vy[nx][j];
a5[nx][j][k] = a2[nx][j][k] * tem[nx][j];
}
}
void TForm1::allocate()
{
if(!ballocate)
{
x = new double[nx+1];
y = new double[nx+1];
qtimen = new double[nx+1];
current = new double *[nx+1];
acat = new double *[nx+1];
acatIn = new double *[nx+1];
fi = new double *[nx+1];
dhdx = new double *[nx+1];
dhdy = new double *[nx+1];
output = new double *[nx+1];
pres = new double *[nx+1];
vx = new double *[nx+1];
vy = new double *[nx+1];
tem = new double *[nx+1];
vxqtime = new double *[nx+1];
vyqtime = new double *[nx+1];
38
tqtime = new double *[nx+1];
fiqtime = new double *[nx+1];
for(int i = 0; i <= nx+1; i++)
{
current[i] = new double[ny+1];
acat[i] = new double[ny+1];
acatIn[i] = new double[ny+1];
fi[i] = new double[ny+1];
dhdx[i] = new double[ny+1];
dhdy[i] = new double[ny+1];
output[i] = new double[ny+1];
pres[i] = new double[ny+1];
vx[i] = new double[ny+1];
vy[i] = new double[ny+1];
tem[i] = new double[ny+1];
vxqtime[i] = new double[ny+1];
vyqtime[i] = new double[ny+1];
tqtime[i] = new double[ny+1];
fiqtime[i] = new double[ny+1];
}
a1 = new double **[nx+1];
a2 = new double **[nx+1];
a3 = new double **[nx+1];
a4 = new double **[nx+1];
a5 = new double **[nx+1];
for (int i = 0; i < nx+1; i++)
{
a1[i] = new double *[ny+1];
a2[i] = new double *[ny+1];
a3[i] = new double *[ny+1];
a4[i] = new double *[ny+1];
a5[i] = new double *[ny+1];
for (int j = 0; j < ny+1; j++)
{
a1[i][j] = new double [2+1];
a2[i][j] = new double [2+1];
a3[i][j] = new double [2+1];
a4[i][j] = new double [2+1];
a5[i][j] = new double [2+1];
}
}
ballocate = true;
}
}
void TForm1::freeMemory()
{
39
if(ballocate)
{
delete []x;
delete []y;
delete []qtimen;
for(int i = 0; i <= nx+1; i++)
{
delete []current[i];
delete []acat[i];
delete []acatIn[i];
delete []fi[i];
delete []dhdx[i];
delete []dhdy[i];
delete []output[i];
delete []pres[i];
delete []vx[i];
delete []vy[i];
delete []tem[i];
delete []vxqtime[i];
delete []vyqtime[i];
delete []tqtime[i];
delete []fiqtime[i];
}
for (int i = 0; i < nx+1; i++)
{
for (int j = 0; j < ny+1; j++)
{
delete []a1[i][j];
delete []a2[i][j];
delete []a3[i][j];
delete []a4[i][j];
delete []a5[i][j];
}
delete []a1[i];
delete []a2[i];
delete []a3[i];
delete []a4[i];
delete []a5[i];
}
ballocate = false;
}
}
double trunc( const double& d ){ return (d > 0) ? floor(d) : ceil(d); }
void TForm1::writeMatrixToGrid(matrxi2 m, TStringGrid *sg)
40
{
sg->RowCount = ny;
sg->ColCount = nx;
for (int j = 1; j <= ny; j++)
{
for (int i = 1; i <= nx; i++)
{
sg->Cells[i-1][j-1] = FloatToStr(m[i][j]);
}
}
}
void TForm1::createGraph(TChart* ch, AnsiString t, TColor c, matrxi2 m)
{
ch->Series[0]->Clear();
ch->Title->Text[0].Clear();
ch->Title->Text[0].Add(t);
for (int j = 1; j <= ny; j++)
{
for (int i = 1; i <= nx; i++)
{
ch->Series[0]->Add(m[i][j], "", c);
}
}
}
void TForm1::valueOfComponents()
{
nx = LabeledEdit1->Text.ToDouble();
ny = LabeledEdit2->Text.ToDouble();
xbegi = LabeledEdit3->Text.ToDouble();
xendi = LabeledEdit4->Text.ToDouble();
ybegi = LabeledEdit5->Text.ToDouble();
yendi = LabeledEdit6->Text.ToDouble();
//-----------for (int j = 1; j <= ny; j++)
for (int i = 1; i <= nx; i++)
acatIn[i][j] = StringGrid1->Cells[j-1][i-1].ToDouble();
//-----------pab = LabeledEdit7->Text.ToDouble();
pcd = LabeledEdit8->Text.ToDouble();
presendi = LabeledEdit9->Text.ToDouble();
presi = LabeledEdit10->Text.ToDouble();
fiin = LabeledEdit11->Text.ToDouble();
temi = LabeledEdit12->Text.ToDouble();
veli = LabeledEdit13->Text.ToDouble();
uk = LabeledEdit14->Text.ToDouble();
amp = LabeledEdit15->Text.ToDouble();
41
fasa = LabeledEdit16->Text.ToDouble();
nvib = LabeledEdit17->Text.ToDouble();
qtimework = LabeledEdit18->Text.ToDouble();
qtimepause = LabeledEdit19->Text.ToDouble();
dt = LabeledEdit20->Text.ToDouble();
numprint = LabeledEdit21->Text.ToDouble();
pulse = LabeledEdit22->Text.ToDouble();
//-----------}
//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------void __fastcall TForm1::FormDestroy(TObject *Sender)
{
freeMemory();
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
valueOfComponents();
//-----------allocate();
//-----------for (int j = 1; j <= nx; j++)
for (int i = 1; i <= ny; i++)
{
output[i][j] = 0.0;
dhdx[i][j] = 0.0;
dhdy[i][j] = 0.0;
}
//-----------nk = trunc((qtimework + qtimepause) / dt);
npqtime = nx;
kqtime = trunc(nk / npqtime);
kprint = (trunc(nk / numprint));
newamp = amp; newnpqtime = npqtime;
presend = (presendi / pa);
presi = (presi / pa);
pab = (pab / pa);
pcd = (pcd / pa);
temi = (temi / tem0);
veli = (veli / vmas);
gy = (gyi * lmas / vmas / vmas);
42
xbeg = (xbegi / lmas);
xend = (xendi / lmas);
ybeg = (ybegi / lmas);
yend = (yendi / lmas);
dt = (dt * vmas / lmas);
qtimework = (qtimework * vmas / lmas);
qtimepause = (qtimepause * vmas / lmas);
pmas = (pa / (row * vmas * vmas));
amp = (amp / atu);
epsg = (epsgas / epsan);
uk = (uk / umas);
lrel = (lmas / atu);
jmas = (kap0 * umas / atu);
m2 = ((kap0 * umas * epsan * lmas) / (atu * atu * vmas * row));
m1 = (m2 * row * rgas * tem0 / pa);
m4 = (kap0 * umas * umas * lmas / (vmas * row * cp * tem0 * atu * atu));
m5 = (epsan * jmas * lmas / (romet * atu * vmas));
dx = ((xend - xbeg) / (nx - 1.0));
dy = ((yend - ybeg) / (ny - 1.0));
tx = dt / dx;
ty = dt / dy;
for (int i = 1; i <= nx; i++)
for (int j = 1; j <= ny; j++)
{
output[i][j] = (output[i][j] / atu);
acatIn[i][j] = (acatIn[i][j] / atu);
dhdx[i][j] = (dhdx[i][j] * lmas / atu);
dhdy[i][j] = (dhdy[i][j] * lmas / atu);
}
for (int i = 1; i <= nx; i++)
for (int j = 1; j <= ny; j++)
{
pres[i][j] = presi;
fi[i][j] = fiin;
tem[i][j] = temi;
vx[i][j] = veli;
vy[i][j] = 0.0;
acat[i][j] = acatIn[i][j];
}
for (int i = 1; i <= nx; i++)
x[i] = (xbeg + dx * (i - 1));
for (int j = 1; j <= ny; j++)
y[j] = (ybeg + dy * (j - 1));
bound(2);
for (int i = 1; i <= nx; i++)
for (int j = 1; j <= ny; j++)
43
{
a1[i][j][2] = fi[i][j] * pres[i][j] * acat[i][j] / tem[i][j];
a2[i][j][2] = (1.0 - fi[i][j]) * acat[i][j];
a3[i][j][2] = a2[i][j][2] * vx[i][j];
a4[i][j][2] = a2[i][j][2] * vy[i][j];
a5[i][j][2] = a2[i][j][2] * tem[i][j];
}
for (int j = 1; j <= ny; j++)
{
vxqtime[1][j] = veli;
vyqtime[1][j] = 0.0;
fiqtime[1][j] = fiin;
tqtime[1][j] = temi;
}
//-----------------qtime = 0.0;
qtimeCircle = 0.0;
period = qtimework + qtimepause;
nqtime = 1L;
kpqtime = 0L;
kp = 0L;
kpres = 0L;
kpress = 0L;
numberCircle = 1L;
//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------for (n = 1; n <= nk /** 200*/; n++)
//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------{
kp = kp + 1;
kpqtime = kpqtime + 1;
kpres = kpres + 1;
kpress = kpress + 1;
if (pulse == 0)
ut = uk;
else
{
if (qtimeCircle <= qtimework)
44
ut = uk;
else
ut = 0.0;
}
/* ------------------------------- */
qtime = qtime + dt;
qtimeCircle = qtimeCircle + dt;
predictor(1);
corrector(2);
signflag = !signflag;
--flag;
if (flag == 0)
{
flag = 2;
sinhroflag = !sinhroflag;
}
/* -----estimate metal output and new gap----------- */
sinus = (sin(2.0 * pi * nvib * qtime + fasa));
for (int i = 1; i <= nx; i++)
for (int j = 1; j <= ny; j++)
{
output[i][j] = output[i][j] + eta * current[i][j] * dt * cycle * m5;
acat[i][j] = acatIn[i][j] + output[i][j] + amp * sinus;
}
SumCurrent = 0;
for (int i = 1; i <= nx; i++)
for (int j = 1; j <= ny; j++)
SumCurrent = SumCurrent + current[i][j] * dx * dy;
for (int i = 2; i <= nx - 1; i++)
for (int j = 1; j <= ny; j++)
dhdx[i][j] = 0.5 * (acat[i + 1][j] - acat[i - 1][j]) / dx;
for (int i = 1; i <= nx; i++)
for (int j = 2; j <= ny - 1; j++)
dhdy[i][j] = 0.5 * (acat[i][j + 1] - acat[i][j - 1]) / dy;
for (int j = 1; j <= ny; j++)
{
dhdx[1][j] = 0.5 * (-3.0 * acat[1][j] + 4.0 * acat[2][j] - acat[3][j]) / dx;
dhdx[nx][j] = 0.5 * (3.0 * acat[nx][j] - 4.0 * acat[nx - 1][j] + acat[nx - 2][j]) / dx;
}
for (int i = 1; i <= nx; i++)
{
dhdy[i][1] = 0.5 * (-3.0 * acat[i][1] + 4.0 * acat[i][2] - acat[i][3]) / dy;
dhdy[i][ny] = 0.5 * (3.0 * acat[i][ny] - 4.0 * acat[i][ny - 1] + acat[i][ny - 2]) / dy;
}
//curvaiter(kp);
45
/* -------------save resultes in assigned moments---------------- */
if (kpqtime == kqtime)
{
for (int j = 1; j <= ny; j++)
{
vxqtime[nqtime + 1][j] = vx[nx][j];
vyqtime[nqtime + 1][j] = vy[nx][j];
fiqtime[nqtime + 1][j] = fi[nx][j];
tqtime[nqtime + 1][j] = tem[nx][j];
}
qtimen[nqtime] = qtime;
kpqtime = 0;
if(nx != nqtime)
nqtime = nqtime + 1;
}
}
Label1->Font->Color = clLime;
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button5Click(TObject *Sender)
{
writeMatrixToGrid(vx, StringGrid2);
createGraph(Chart1, "initial field of vx velocity", clRed, vx);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button6Click(TObject *Sender)
{
writeMatrixToGrid(vy, StringGrid2);
createGraph(Chart1, "initial field of vy velocity", clRed, vy);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button7Click(TObject *Sender)
{
writeMatrixToGrid(fi, StringGrid2);
createGraph(Chart1, "initial field of gaz saturation", clRed, fi);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender)
{
writeMatrixToGrid(pres, StringGrid2);
createGraph(Chart1, "initial pressure fild", clRed, pres);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button9Click(TObject *Sender)
{
46
writeMatrixToGrid(tem, StringGrid2);
createGraph(Chart1, "start temperature fild", clRed, tem);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button10Click(TObject *Sender)
{
writeMatrixToGrid(vxqtime, StringGrid2);
createGraph(Chart1, "time variation of Velocity X", clRed, vxqtime);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button11Click(TObject *Sender)
{
writeMatrixToGrid(vyqtime, StringGrid2);
createGraph(Chart1, "time variation of Velocity Y", clRed, vyqtime);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button12Click(TObject *Sender)
{
writeMatrixToGrid(fiqtime, StringGrid2);
createGraph(Chart1, "time variation of saturation", clRed, fiqtime);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button13Click(TObject *Sender)
{
writeMatrixToGrid(tqtime, StringGrid2);
createGraph(Chart1, "time variation of temperature", clRed, tqtime);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button14Click(TObject *Sender)
{
writeMatrixToGrid(output, StringGrid2);
createGraph(Chart1, "Output distribution", clRed, output);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button4Click(TObject *Sender)
{
if(SaveDialog1->Execute())
{
valueOfComponents();
std::fstream fs(SaveDialog1->FileName.c_str(), std::ios::out);
if(fs.is_open())
{
fs << nx << " " << ny << " " << xbegi << " " << xendi << " " << ybegi << " " << yendi << std::endl;
for (int j = 1; j <= ny; j++)
{
47
for (int i = 1; i <= nx; i++)
fs << acatIn[i][j] << " ";
fs << std::endl;
}
fs << pab << " " << pcd << " " << presendi << " " << presi << " " << fiin << " " << temi << " " << veli << " " << uk << "
" << amp << " " << fasa << " " << nvib << " " << qtimework << " " << qtimepause << " " << dt << " " << numprint << " " << pulse;
fs.close();
}
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (OpenDialog1->Execute())
{
std::fstream fs(OpenDialog1->FileName.c_str(), std::ios::in);
if(fs.is_open())
{
fs >> nx >> ny >> xbegi >> xendi >> ybegi >> yendi;
allocate();
for (int j = 1; j <= ny; j++)
for (int i = 1; i <= nx; i++)
fs >> acatIn[i][j];
fs >> pab >> pcd >> presendi >> presi >> fiin >> temi >> veli >> uk >> amp >> fasa >> nvib >> qtimework >>
qtimepause >> dt >> numprint >> pulse;
fs.close();
LabeledEdit1->Text = FloatToStr(nx);
LabeledEdit2->Text = FloatToStr(ny);
LabeledEdit3->Text = FloatToStr(xbegi);
LabeledEdit4->Text = FloatToStr(xendi);
LabeledEdit5->Text = FloatToStr(ybegi);
LabeledEdit6->Text = FloatToStr(yendi);
writeMatrixToGrid(acatIn, StringGrid1);
LabeledEdit7->Text = FloatToStr(pab);
LabeledEdit8->Text = FloatToStr(pcd);
LabeledEdit9->Text = FloatToStr(presendi);
LabeledEdit10->Text = FloatToStr(presi);
LabeledEdit11->Text = FloatToStr(fiin);
LabeledEdit12->Text = FloatToStr(temi);
LabeledEdit13->Text = FloatToStr(veli);
LabeledEdit14->Text = FloatToStr(uk);
LabeledEdit15->Text = FloatToStr(amp);
LabeledEdit16->Text = FloatToStr(fasa);
48
LabeledEdit17->Text = FloatToStr(nvib);
LabeledEdit18->Text = FloatToStr(qtimework);
LabeledEdit19->Text = FloatToStr(qtimepause);
LabeledEdit20->Text = FloatToStr(dt);
LabeledEdit21->Text = FloatToStr(numprint);
LabeledEdit22->Text = FloatToStr(pulse);
//Button2->Click();
}
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button3Click(TObject *Sender)
{
if(SaveDialog1->Execute())
{
valueOfComponents();
std::fstream fs(SaveDialog1->FileName.c_str(), std::ios::out);
if(fs.is_open())
{
fs << "ntime=0" << std::endl;
fs << " initial field of vx velocity" << std::endl;
fs << " initial field of vx velocity" << std::endl;
for (int j = 1; j <= ny; j++)
{
for (int i = 1; i <= nx; i++)
{
fs << vx[i][j] << vx[i][j];
}
fs << "" << std::endl;
fs << "" << std::endl;
}
fs << " initial field of vy velocity" << std::endl;
fs << " initial field of vy velocity" << std::endl;
for (int j = 1; j <= ny; j++)
{
for (int i = 1; i <= nx; i++)
{
fs << vy[i][j] << vy[i][j];
}
fs << "" << std::endl;
fs << "" << std::endl;
}
fs << " initial field of gaz saturation" << std::endl;
fs << " initial field of gaz saturation" << std::endl;
for (int j = 1; j <= ny; j++)
49
{
for (int i = 1; i <= nx; i++)
{
fs << fi[i][j] << fi[i][j];
}
fs << "" << std::endl;
fs << "" << std::endl;
}
fs << "initial pressure fild" << std::endl;
fs << "
initial pressure fild" << std::endl;
for (int j = 1; j <= ny; j++)
{
for (int i = 1; i <= nx; i++)
{
fs << pres[i][j] << pres[i][j];
}
fs << "" << std::endl;
fs << "" << std::endl;
}
fs << "start temperature fild" << std::endl;
fs << " start temperature fild" << std::endl;
for (int j = 1; j <= ny; j++)
{
for (int i = 1; i <= nx; i++)
{
fs << tem[i][j] << tem[i][j];
}
fs << "" << std::endl;
fs << "" << std::endl;
}
fs << " cycle number" << numberCircle << " time="<<qtime<<" n=" << n << std::endl;
fs << " time variety of the velocity vx in the section x=length" << std::endl;
fs << " timen y vxtime vytime fitime ttime output " << std::endl;
for (int j = 1; j <= ny; j++)
{
for (int i = 1; i <= npqtime; i++)
{
fs << qtimen[i] << y[j] << vxqtime[i][j] << vyqtime[i][j] << fiqtime[i][j] << tqtime[i][j] << std::endl;
i = i;
}
j = j;
}
for (int j = 1; j <= ny; j++)
{
50
for (int i = 1; i <= npqtime; i++)
{
fs << vxqtime[i][j];
}
fs << "" << std::endl;
}
fs << " time variation of the velocity vy in the section x=length" << std::endl;
for (int j = 1; j <= ny; j++)
{
for (int i = 1; i <= npqtime; i++)
{
fs << vyqtime[i][j];
}
fs << "" << std::endl;
}
fs << "
time variation of the gaz saturation in the section x=length" << std::endl;
for (int j = 1; j <= ny; j++)
{
for (int i = 1; i <= npqtime; i++)
{
fs << fiqtime[i][j];
}
fs << "" << std::endl;
}
fs << "
time variation of the temperature in the section x=length" << std::endl;
for (int j = 1; j <= ny; j++)
{
for (int i = 1; i <= npqtime; i++)
{
fs << tqtime[i][j];
}
fs << "" << std::endl;
}
fs << "output field (mkm) n="<<n<<" time="<<qtime * lmas / vmas<<" (sec)" << std::endl;
for (int j = 1; j <= ny; j++)
{
for (int i = 1; i <= nx; i++)
{
fs << output[i][j] * atu * 1000000L ;
}
fs << "" << std::endl;
}
fs.close();
}
}
}
51
//--------------------------------------------------------------------------void __fastcall TForm1::LabeledEdit1Change(TObject *Sender)
{
nx = LabeledEdit1->Text.ToIntDef(1);
StringGrid1->ColCount = nx;
}
//--------------------------------------------------------------------------void __fastcall TForm1::LabeledEdit2Change(TObject *Sender)
{
ny = LabeledEdit2->Text.ToIntDef(1);
StringGrid1->RowCount = ny;
}
//--------------------------------------------------------------------------void __fastcall TForm1::StringGrid1GetEditText(TObject *Sender, int ACol,
int ARow, AnsiString &Value)
{
//if(ACol == 0 && ARow == 0)
/* for (int j = 1; j < ny; j++)
for (int i = 1; i < nx; i++)
StringGrid1->Cells[i][j] = Value; */
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1Enter(TObject *Sender)
{
/*//if(ACol == 0 && ARow == 0)
for (int j = 1; j <= ny; j++)
for (int i = 1; i <= nx; i++)
StringGrid1->Cells[i-1][j-1] = StringGrid1->Cells[0][0];*/
}
//--------------------------------------------------------------------------void __fastcall TForm1::StringGrid1SetEditText(TObject *Sender, int ACol,
int ARow, const AnsiString Value)
{
//if(ACol == 0 && ARow == 0)
for (int j = 0; j <= ny; j++)
for (int i = 0; i <= nx; i++)
{
if((i != 0) || (j != 0))
StringGrid1->Cells[i][j] = Value;
}
}
52
//--------------------------------------------------------------------------void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
int ARow, bool &CanSelect)
{
/*Caption = nx;
//if(ACol == 0 && ARow == 0)
for (int j = 1; j <= ny; j++)
for (int i = 1; i <= nx; i++)
StringGrid1->Cells[i-1][j-1] = StringGrid1->Cells[0][0];*/
}
Скачать