باسلام
میخواستم بدونم اگه داده های میانگین ماهانه را در برنامه ام که با زبان فرترن است بخوام فراخوانی کنم چجور این کار رو باید انجام بدم یعنی چجور یه سری ماه های خاص رو از داده هام جدا کنم مثلا ماه های تابستان 30 سال اخیر را چطور میتونم فراخوانی کنم لطفا راهنماییم بفرمایید.

ی., 13/04/2014 - 17:52
سلام
سلام
آیا هیچ فایل توضیحی برای دادهها وجود داره؟ منظورم اینه که میدونید با چه ساختاری نوشته شدن؟ سوال بعد اینکه فرمت اونا ascii (اسکی) هست یا binari (دودویی)؟
فایلها باپسوند
فایلها باپسوند
dat هستند و و با فرمت باینری ذخیره شدند
با فرض اینکه دادهها در یک
با فرض اینکه دادهها در یک تراز و به صورت خطی خیره شده باشند مراحل کار به صورت زیر میتواند باشد:
اول برخی متغیرهای مورد نیاز را تعریف میکنیم:
که y تعداد کل سالهایی است که دادههایش را در اختیار داریم (در اینجا 30 سال)، عدد 12 تعداد ماههای سال و n تعداد کل دادهها خواهد بود. متغیر field_in را به طور عام به همه دادهها نسبت میدهیم.
فایل داده را با دستوری مثل زیر در برنامه آدرس دهی میکنیم:
که در قسمت طول رکورد (recl) ، عدد 4 دقت مورد نظر است که متناسب با دقت field_in میباشد.
در مرحله بعد میشود با یک خط دستور همه داده ها را خواند:
سپس با استفاده از اندیس دادهها (از 1 تا n) از طریق مقایسه با یک شرط میشود فقط داده ماههای خاصی که مورد نظر است جدا کرد
از هر برنامهای که بخواهید استفاده کنید لازم است مثل اینجا، در آغاز همه دادهها را وارد کرده و سپس بخشی از آنرا جدا و استفاده کنید.
به طور مثال، در برنامهای یکی
به طور مثال، در برنامهای یکی از روشهای استخراج ماههای موردنظر را نوشته ام.
http://paste.starnix.ir/phprmwdtn
http://paste.starnix.ir/p9gkxa4lb
در برنامه اول (test-w.f95) برای 36 ماه (3سال) اعداد 1 تا 36 در نظر گرفته و در فایل باینری به اسم mean.dat به صورت خطی و یک ترازه ذخیره می شود.
در برنامه دوم (test.f95) همین فایل، خوانده شده و فقط سه ماه تابستان (tir و mordad و shahrivar) استخراج میگردد.
سلام
سلام
و تشکر از پیگیریتون این کامنت اخری لینکها باز نمیشن و ارور میگیره
این لینکها معمولا محدودیت
اگر ذخیره دادههای شما دو بعدی باشه با ساختاری مثل لینک زیر (مقیاس قایم بر حسب سال و مقیاس افقی بر حسب ماه)، کار جداسازی دادهها بدون استفاده از شرط و سادهتر هم میشود
http://cri.ac.ir/files/Data/Synoptic%20Data%20up%20to%20l2005/ESFAHAN
دو برنامه زیر دادهها با ساختار دو بعدی را پردازش میکنند:
باسلام
باسلام
میخواستم بدونم حالا که داده های میانگین ماهانه هرrec رو تونستم جدا کنم برای اینکه بتونم یه منطقه خاصی رو از لحاظ طول و عرض جغرافیایی جدا کنم باید field_inرو 3 بعدی تعریف میکردم با وجودی که داده های ماهانه من یک بعدی بودند؟
باتشکر
در این مورد مطمئن نیستم. باید
در این مورد مطمئن نیستم. باید دید که دادهها رو به چه شکل ذخیره کردن. این دادهها رو از کجا تهیه کردید؟
سلام داده ها از سایت ncep
سلام داده ها از سایت ncep-ncar گرفته شده
جوابتون خیلی کلی بود.لطفا
جوابتون خیلی کلی بود.لطفا لینک دادهها رو بذارید تا ببینم چی هستن.اگر فرمتش مشخص بشه خوندنش کاری نداره.بعضی وقتا خود سایت میزبان یک برنامه هم برای خوندن دادهها میذاره!
مشکل در واقع این هست که ما
مشکل در واقع این هست که ما اندازه درست ابعاد آرایه دادهها رو نمیدونیم.
شاید بشه با allocate کردن بفهمیم ابعاد واقعیش چقدره. قدر مسلم اینه که محور x و y نماینده طول و عرض جغرافیایی هستند.
من با این فایل کنترلی توی
من با این فایل کنترلی توی گردس میتونم دادهها رو بخونم، اما هنوز نمیفهمم ابعاد آرایه رو برای فرترن چطور تنظیم کنم.
خودم با یه برنامه مثل این،
خودم با یه برنامه مثل این، دادههایی با ساختار مشابه رو خوندهام(کل سطح زمین بود در 23 تراز قائم و 25 زمان). اما واسه دادههای شما هنوز جواب نداده .
خداروشکر بلاخره درست شد. مشکل
خداروشکر بلاخره درست شد. مشکل این بود که ما فکر میکردیم باید مثل یک فرمت استاندارد دادههای چند ترازه خونده بشه. درحالی که این خودش خروجی یک برنامه دیگه بوده و باید در نظر میگرفتیم که نویسنده اون برنامه احتمالا بُعد زمان رو به عنوان بعد سوم در راستای z در نظر گرفته و همه دادهها رو در یک رکورد ذخیره کرده. برای همین بود که ما نمیتونستیم بیشتر از یک رکورد رو بخونیم. 1 نکته برنامه نویسی: خوبه زمانی که در یک حلقه قراره دادههای زیادی خونده بشه، چیزی مثل ضربان قلب برای چک کردن این که حلقه درست کار میکنه و اگر اشتباهه تا کجا پیش رفته، قرار بدیم (مثل خط 17 برنامه ای که اینجا گذاشتم).
مورد بعدی، مسأله جدا کردن یک طول و عرض خاص هست. در جغرافیا طول و عرض از 0 شروع میشه درحالی که در برنامه ما با شماره یک مولفه آرایهها سروکار داریم که از 1 شروع میشن. پس با تقسیم بر 2.5 که در واقع همون تفکیک فضایی دادههاست و اضافه کردن عدد 1، میتونیم شماره آرایه متناسب با طول و عرض مورد نظر رو داشته باشیم. اما از اونجایی که ممکنه طول و عرض مورد نظر مضرب صحیحی از 2.5 نباشه این محاسبه منجر به یک عدد اعشاری میشه که برای شماره یک آرایه درست نیست. پس میتونیم با اضافه کردن یک شرط عدد بدست اومده رو به سمت بالا یا به سمت پایین به صورت یک عدد صحیح گرد کنیم.
امیدوارم موفق باشید
سلام تشکر از اینکه وقتتون رو
سلام تشکر از اینکه وقتتون رو روی برنامه گذاشتین
چند سوال برام پیش اومده که ازتون میخواستم بپرسم:
1) به چه شکلی باید متوجه بشیم که فرمت این داده ها و داده های مشابه تو یه رکورد ثبت شده اند؟
2)ایا دستور MOD و AMOD با هم فرقی دارند چون دستور AMOD رو هرجا نگاه کردم با MOD می اوردند؟
3)چون منطقه کار من نیمکره شمالی است میتوان از نوشتن LA=LA+90 صرفنظر کرد؟
4)دلیل انتخاب 1.25 در (AMOD(la,2.5) > 1.25) رو متوجه نشدم؟
5)هنگام چاپ 3ماه مورد نظر ترتیب ماه مثلا JUN را ابتدا ستون اول بعد باقیمانده به ستون دوم باید بخوانیم یا باید ماه های ژون را سطری بخوانیم؟
باتشکر فراوان
سلام.
سلام.
جواب سوالها:
1) راهی جز خوندنشون نیست. ما هم فرض رو بر این گذاشتیم که در رکورد ذخیره شدن. و توی خط 16 برنامه قبلی نمایشگری گذاشته بودم که رکوردها رو نشون میداد. خوب این شمارنده نشون داد دادهها فقط یک رکورد دارن. نتیجه گرفتم ماتریس دادهها احتمالا سه بعدی بوده و متغیر زمان بُعد سوم باید باشه (به جای ارتفاع که معمولا بُعد سومه و زمان در رکوردها ثبت میشه)
2)من توی وبسایتی به آدرس زیر دیدم که آرگومانهای ورودی تابع mod از نوع صحیح هستند و amod از نوع حقیقی .پس از این تابع استفاده کردم:
http://gcc.gnu.org/onlinedocs/gfortran/MOD.html
3)خیر. چون شماره آرایه از پایین (یعنی قطب جنوب) شروع میشه و مثلا اگر منظور شما 30 درجه شمالی باشه و فقط همون 30 رو بدون اون محاسبه بزنید، عدد آرایه 60 درجه جنوبی برای شما درنظر گرفته میشه.
4)دقت تفکیک دادههای شما 2.5 درجه هستند. یعنی به طور مثال اطلاعات 30 و 32.5 درجه رو داره ولی 31 رو نداره.1.25 نصف 2.5 هست. اگر باقیمانده تقسیم که عددی بین 0 تا 2.49 میشه از 1.25 بزرگتر باشه به سمت عرض بالاتر و اگر کمتر از 1.25 باشه به سمت پایین گرد میشه. بنابر این منطق، چنانچه عرض 31 مد نظر شما باشه، عدد مربوط به عرض 30 منظور میشه. البته میشه یک کار بهتر انجام داد و یک میانگین وزندار برای محاسبه مقادیر غیر صحیح (مثلا همون نقطه 31 درجه) نوشت که البته بهتر هم هست.
5) متوجه سوالتون نشدم
راستی شما اگر محاسبه خاصی
راستی شما اگر محاسبه خاصی (مثلا اعمال فیلتر بر دادههاتون) ندارید میتونید دادهها رو با گردس هم از طریق اسکریپنویسی پردازش کنید. اینطوری به نظر ملموستر هم هست چون میتونید نتیجه رو بلافاصله رسم و مشاهده کنید. در این زمینه میتونید برای کاربست توابع و برنامههای آماده گردس، دو وبسایت زیر رو بررسی کنید:
http://www.met.wau.nl/education/atd/Practical/scripts/library_local.html
http://www.met.wau.nl/education/atd/Practical/functions/library.html
سلام به یه مشکلی دوباره
سلام به یه مشکلی دوباره برخوردم تو قسمت انتهایی برنامم وقتی دستور WRITE رو میزنم فقط مقدار اولیه رو مثلا ماه جون سال 48 رو محاسبه می کنه بقیه ماه های جون سالهای بعد رو صفر میده برا 2 متغیر دیگه هم به همین شکل
ادامه برنامه بعد از خوندن داده ها:
در خوندن دادهها هیچ اشکالی
در خوندن دادهها هیچ اشکالی وجود نداره. میتونید این رو با اضافه کردن یک خط دستور مثل
در شرط مربوط به جداسازی ماه آگوست چک کنید.
قسمت محاسبه میانگین ماهها رو به صورت زیر اصلاح میکنم (شما فراموش کردید اینا رو در یک حلقه محاسبه کنید، یک سری چیزای زاید رو پاک کردم و حلقهای که ایجاد کردم رو با حروف کوچک نوشتم)
ولی از محاسبات آنومالی نفهمیدم قصد دارید با چه ضابطهای اون رو حساب کنید ولی احتمالا اونم به یک حلقه نیاز داره