text:
What happens when your car insurance is cancelled?
Free Car Insurance Comparison
Secured with SHA-256 Encryption
UPDATED: Jul 21, 2017
It's all about you. We want to help you make the right coverage choices.
We strive to help you make confident insurance decisions. Comparison shopping should be easy. We partner with top insurance providers. This doesn't influence our content. Our opinions are our own.
- A canceled policy is worse than a non-renewal of policy
- Without insurance you are not legally allowed to drive
- Cancellation of your policy puts you in a high-risk category
- You may find it difficult to obtain other insurance after cancellation, but there are other options available
When a car insurance company decides to cancel your policy, it can pose as a major inconvenience to your everyday lifestyle.
It is important to be aware of the implications canceled car insurance may have on you and your family.
Find out the reasons why car insurance can be canceled and what to do if you ever find yourself in that situation. Compare rates now by using our FREE tool above!
What is a canceled policy?
There are two ways that insurance companies can drop you: non-renewal of policy and cancellation of policy.
Although non-renewal and cancellation are similar in nature due to the fact the company no longer will insure you, they are not one in the same.
Non-renewal is when your insurance company notifies you that your current coverage will continue until the end of the policy period, but will not be renewed thereafter.
This could be due to a number of reason such as filing multiple claims in a short period of time or simply because they don't want to insure you anymore.
A canceled policy is a complete termination of your policy and carries much more severe consequences with it.
What are the reasons for cancellation?
During the first two months of insurance, called the binding period, the insurance company has the discretion to drop an insured for any reason. Although, this is not typical.
Beyond that time frame, the insurance company must have a very specific reason for canceling a policy. Each state also dictates the specifics of a company's authority to cancel a policy.
Here are some of the most common reasons for cancellation:
- Failing to pay insurance premiums
- Falsifying information on your insurance application
- A suspended or revoked license due to DUI or other offenses
- Diagnosis of medical condition that impairs your ability to drive
Free Car Insurance Comparison
Secured with SHA-256 Encryption
How will cancellation of your insurance affect you?
One of the most daunting parts about a canceled insurance policy is that you are not legally allowed to drive without insurance.
Not being able to drive takes away your independence from driving yourself to work, the grocery store, or taking the kids to school and sporting activities.
If you get caught driving without insurance, you could face fines as well as possible jail time.
Not only is it limiting on your lifestyle, but it can also affect you in other ways. Cancellation of your policy will result as a negative mark against your driving record.
If you share your insurance with your whole family, cancellation of the policy will affect everyone named. Your insurance premiums will be considerably higher than what you are used to because you are now considered a high-risk driver.
If your vehicle is financed and you cannot afford the higher premiums, your vehicle could be repossessed.
What to do?
In the event your insurance is canceled, it is very important to seek out other insurance alternatives as soon as possible.
The reason being if you were to continue to drive and get into an accident, you would be liable for all of your out of pocket expenses, which could run into the hundreds of thousands of dollars.
Also having a lapse in coverage could lead to you paying higher insurance premiums as well as fines from the Department of Motor Vehicles.
If you were canceled for a reason such as non-payment, you may be able to work out a payment agreement with a new insurance company.
Shopping around is the best way to find the lowest rates available to you, so collect several quotes online from reputable car insurance companies.
For other more serious offenses of cancellation, you may have a hard time finding insurance. But even so, you are likely able to obtain coverage through your state's assigned-risk program.
If you believe your car insurance company wrongfully dropped you, you may be able to appeal to the State Department of Insurance.
A canceled policy is bad news, but it is not the end of the line for you. Ultimately, your insurance company wants your business.
As long as you drive safely and continue to pay your premium on time, whether it be monthly or quarterly, you shouldn't have a problem with your insurance company wanting to cancel your policy.
As a responsible customer, your insurance company will love you and you can avoid all the hassle that comes with a canceled policy. Enter your zip code in our FREE tool below for instant quotes now!
Free Car Insurance Comparison
Compare quotes from the top car insurance companies and save!
Secured with SHA-256 Encryption


text:
Designer Peels
Posted on Thursday, 6 Sep 2012 10:50 AM by Innovative Esthetics
Lactic or Glycolic Acid Peels
Excellent for any skin type that needs exfoliation. Leaves the skin with a healthy glow and can be combined with microdermabrasion.
Also available in a series of 6
Jessner Peels
For skin that needs a stronger exfoliation. Excellent for clearing,fading and preventing acne, as well as ingrown hairs and post inflammatory hyperpigmentation.
Also available in a series of 6
Other Peels (TCA, AHA/BHA, TCA Herbal)
Not for the faint of pore, these medium depth peels will reveal a newer, clearer complexion. They are very effective in the treatment of mild to moderate acne scarring, deeper wrinkles, and hyperpigmentation.
Call for a free consultation.

subset: commoncrawl


text:
Over 70 MPs attend parliamentary launch of Clean for The Queen
More than 70 MPs, including Government Ministers and the Mayor of London, attended the parliamentary launch of the Clean for The Queen campaign in the Jubilee Room at the Houses of Parliament.
They entered into the spirit of the campaign and donned purple campaign t-shirts and wielded litter pickers for a photocall to publicise the campaign and to lead the call for community groups, schools and businesses to help tidy up their local area in their constituencies ahead of The Queen's 90th birthday.
More than one million people are expected to join the UK's largest litter pick over the Clean for The Queen Weekend over 4, 5 and 6 March.
The Prime Minister is backing the campaign. David Cameron said: "I am delighted that West Oxfordshire is joining the UK's biggest anti-litter campaign ahead of The Queen's 90th birthday.
"It really is a special event and provides great momentum for communities to gather together and do our bit to clean up – and get our country looking fit for a Queen!"
The Mayor of London, Boris Johnson, is donating 100 clean-up kits containing litter pickers, gloves and rubbish bags for the special clean-up weekend. Boris Johnson, said: " I want to encourage everyone to get together like-minded neighbours and friends to litter pick, plant, paint and tidy and really brighten local spaces. This year we have the extra incentive of making our city as beautiful as possible in honour of The Queen."


text:
Everyone likes to boast that they're the absolute best at sex. Whether it was that one kid in high school who clearly hadn't had sex yet but felt the need to declare himself "king of orgasms" in order to save face or a particular group of individuals who are probably truthful in their honest examination of their collective sexual prowess, the ability to turn it up between the sheets has been a point of pride since always. Which is why it's worth mentioning that if there's a silent contest for who's the best in bed, sex positive women win.
When a woman identifies as sex positive, she's letting everyone know that she believes that all safe, consensual sex, is good sex. She won't view her sexual desires as anything other than normal, and she won't claim sex as a taboo topic that shouldn't be openly discussed and shamelessly explored. The freedom afforded and passionately owned (and often times, fought for) by those who identify as sex-positive, undoubtably manifests into great sex, awesome sex, enjoyable sex, and satisfying sex.
The unnecessary social stigma surrounding sexuality — particularly women's sexuality — can inhibit the sex any one woman or women have. It can weigh women down, to the point that they feel like they have to adhere to an unrealistic standard of stifled sexual need, in order to be seen as a "good" or "nice" or "worthwhile" woman. But the sex-positive movement is working towards changing the way we view and talk about and engage in sex, and that change can result in some mind-blowing bumping of the ole uglies.
So, with all that in mind, here are eight reasons why sex positive women are better in bed. Nothing says "great at sex" like shame-free sex.
They're Not Ashamed Of Sex
A sex-positive woman knows that all safe and consensual sex is good sex. She's aware that sex is a natural part of our human existence and isn't going to let social stigmas or religious judgement dictate her sexuality and the way in which she chooses to explore and express it. Sex is nothing to be ashamed of, and it most certainly doesn't decrease an individual's value. The freedom that comes with that knowledge is, well, sexy.
They're Not Afraid To Talk About Sex
Because sex isn't a taboo topic for a sex-positive woman, she won't be afraid to openly discuss all things sex with her partner or potential partners. Open lines of communication are essential to ensuring the sex being had between two (or more) adults is safe and consensual and as pleasurable as possible.
They're Not Embarrassed Of Their Sexual Needs
A sex-positive woman isn't going to view her sexual needs as a burden or an inconvenience or a defect that needs to be hidden and/or fixed. No, a sex positive woman is going to see her sexual needs for everything they are; a natural part of her humanity that deserve tending to, either by herself or by someone else (and, you know, sometimes both!) Which is why she won't hesitate to voice those needs or act on those needs, which means that when you're being intimate with a sex-positive woman, you know that she's having just as much fun as you are.
They Believe All Safe Sex Is Good Sex
A sex-positive woman isn't going to shame or judge you for the kind of sex you're into. Dominant, submissive, conventional, or exploratory; it's all in good fun, and it's all for the betterment of our health and happiness. There's a wonderful freedom associated with sex positivity, a kind that gives people the courage and silent permission to explore their bodies — and the body of someone or multiple someones — without shame or anxiety and with acceptance and enjoyment. TL;DR, when you're not worried about what other people think of the kind of sex you're having, the sex you're having gets better.
They're Down To Experiment And Explore
Most sex positive women aren't afraid to explore their sexuality, so that they can find what satisfies them the most. They're acutely aware that the sex they're having with one or multiple partners is no one else's business, which gives them the security to explore their sexuality and try new things, even and especially when those things aren't openly accepted by mainstream society.
They'll Ask You What You Like
A sex-positive woman believes that sex should be beneficial for all parties involved, which means she's likely to ask you what you like, what turns you on, and if there's anything you're usually into that she isn't doing. Of course, she won't sacrifice her personal safety or comfort to ensure you climax, but she will openly communicate about what you like and don't like to make sure that your personal safety and comfort aren't jeopardized either.
They Believe A Body's Reaction To Sex Is Natural
Sex can be mess. Whether you're having period sex or pregnancy sex or you're body is secreting natural discharges, or noises are being made that often aren't depicted in the latest rom-com, a sex-positive woman isn't going to think that sex is "gross." However your body reacts to sex is going to be normal, and she isn't going to think that very real sites and sounds of sex are anything but natural.
They're Probably Body Positive, Too
Many sex positive women are also body positive women. Women who refuse to hate their bodies have amazing sex, mostly because they're confident, aren't held back by relentless insecurity and don't use sex to validate their self-worth. When you can view sex as just sex, you free simply enjoy yourself, and that's how you end up having the best sex of your life.


text:
Cypress bonsai tree (Cupressus Sempervirens) in an unglazed hexagonal pot, in natural gres.
Pot size: 36 x 36 x h. 10.5 cm.
The plant is 74 cm high.
Nebari is 6 cm.
Weight: 9.7 kg.
The picture really reflects and faithfully plant that will be purchased and shipped.
The pictures change about 1 time per month, so the only variant will be the greater or lesser vegetation.
FOR YOU A DISCOUNT OF 5%. Use the DISCOUNT code in the email subscription.
Per informazioni o per qualsiasi dubbio
puoi scriverci su Whats App al numero
324 8854708


text:
|NHL Hockey
|Player News
|Live Odds
|4:00 PM PT5:00 PM MT6:00 PM CT7:00 PM ET0:00 GMT8:00 5:00 PM MST7:00 PM EST4:00 UAE (+1)19:00 ET21:00 BRT, February 21, 2020
PNC Arena, Raleigh, North Carolina Attendance: 18,680
Hurricanes seek consistent effort versus visiting Rangers
The Carolina Hurricanes have a tendency to be hot and cold this season, and that has brought considerable highs along with notable concerns.
So riding the wave of the successes is one of the key components that confronts the team on a regular basis.
The Hurricanes attempt to display a semblance of consistency on Friday when facing the visiting New York Rangers in Raleigh, N.C.
"It's time to get this going in the right direction," Hurricanes forward Justin Williams said. "It's not the first 20 games right now, it's the last 20."
The Hurricanes have points in three consecutive games (2-0-1).
Carolina enjoyed solid performances across the ice in a 4-1 win at Nashville on Tuesday, prompting coach Rod Brind'Amour to say "it looks like we know what we're doing. ... I thought we were engaged, everybody."
The Hurricanes are aiming to bottle the performance in Music City and carry it with them. They saw so many things come together that it was barometer to where they can be.
"There wasn't really much letdown," said captain Jordan Staal, who called it one of the most complete games of the season. "I really loved the effort from everyone. It was all good things."
Staal came through with his first goal since Jan. 16, so that was one of the boosts the team received.
"I've been fighting it for a while," Staal said. "It's no question, it's no secret that I need to be more offensive if we're going to make a push."
Only two of Staal's eight goals this season have come on home ice.
The Rangers are among the teams contending with the Hurricanes for a playoff spot.
"It's going to be a playoff-type game for us in a lot of ways," New York coach David Quinn said of Friday night's contest.
New York has won six consecutive road games, including a 6-3 decision in Chicago on Wednesday night. The franchise record for consecutive road victories is seven.
"Our guys feel really good about themselves, whether on the road or at home," Quinn said. "Listen, you've got to win games when you're not playing great."
Many mothers of the Rangers players are on the trip with the team for the stops in Chicago and Carolina. The Hurricanes' players had their mothers with them for the game at Nashville.
The Rangers could have forward Julien Gauthier in the lineup after he made his debut with the team Wednesday night. He was acquired in a trade earlier in the week from Carolina, with which he made his NHL debut this season.
"He didn't play a lot of minutes (at Chicago)," Quinn said. "I thought he did a good job of feeling more comfortable."
The Hurricanes are 0-3-0 against the Rangers this season, with the most recent meeting coming Dec. 27.
Rangers goalie Henrik Lundqvist has been in the net for each of the first three meetings. He made 39 saves in the latest conquest of Carolina, including stopping all 14 shots when the Rangers were shorthanded.
Lundqvist owns a 33-12-1 record with two shutouts, a 2.00 goals-against average and .934 save percentage in 46 career starts versus Carolina.
-Field Level Media
Updated February 20, 2020


text:
Hector (Owner): With almost 40 years of experience in the security and law enforcement industry, Hector has an extensive background in surveillance techniques and investigations. These include: security operations, set-up, hiring, training and management of security operations as well as extensive experience in night clubs and bars. Hector has not only run security operations of 80,000 to 100,000 capacity stadiums all over the country, but has also body guarded some of the worlds most famous high profile celebrities and respected public figures.
Leone (Lee): Lee led a prestigious 25 year career with the FBI as he held positions such as the commander of the Chicago Organized Crime Taskforce and Program Manager at FBI headquarters. For eight years Lee was the legal attaché in Rome, Italy where he was responsible for FBI liaison with law enforcement and judicial officials in Eastern Europe and the Middle East. Subsequent to his FBI retirement, he served as security manager for all of the 1994 World Cup events. In addition to his experience, Lee is fluent in the Italian language, and also holds a law degree (Juris Doctor) from the DePaul School of Law.
Robert: During Robert's 27 year career with the FBI, he supervised a surreptitious technical services unit and a multi-agency violent crimes unit emphasizing fugitive investigation. As a former member of the elite FBI critical Incident Negation team, Robert's expertise includes criminal psychology and psychological profiling. He received a Bachelor of Science in Psychology from Loyola University Chicago as well as a Master of Arts degree in administration from DePaul University Chicago. Robert appears on television and radio as a recognized consultant in the areas of criminal psychology, profiling and violent behavior.
William: As a 28 year FBI veteran, William served as a Bomb technician, hostage negotiator and court-approved terrorism expert in both the US and Canada. In addition, William was a former Vice President of safety and security for one of the largest cable television providers. Today, William's role is to provide training in areas such as bomb threats, disaster planning and employee terminations.
Contact VSI Today for a FREE Consultation


text:
A 50-year-old Kansas man died Saturday after falling about 60 feet during a climbing expedition in the 32700 block of Boulder Canyon Drive, also known as Colo. 119, west of Boulder Falls.
After his fall, a group of climbers flagged down a car. The driver was able to reach an area with cell reception where she called police for help at 11:17 a.m., according to a Boulder County Sheriff's Office news release.
The climber fell in an area known as the Bell Buttress, which is across Boulder Creek and a climbing area called The Bowling Alley. A Boulder County Parks and Open Space ranger was nearby and reached the scene at roughly 11:25 a.m. In the meantime, some climbers made their way up to check on the victim, who was up on a ledge and unresponsive, according to the sheriff's office. He was pronounced dead at 12:14 p.m.
Detectives from the Boulder County Sheriff's Office and investigators from the Boulder County Coroner's Office responded to the scene to investigate. Volunteer rescue personnel from Rocky Mountain Rescue Group evacuated the climber's body from the ledge down to the roadway.
From witness accounts, investigators learned that the man had been climbing with a partner. The pair had just completed a climbing route called Cosmos and were walking along the top of the cliff looking for a route to descend. While he was walking up to the edge in search of a path for descent, the rock he stepped on gave way, causing both him and the rock to fall approximately 60 feet to a rock ledge below.
Authorities said the man's identity is being withheld until his family is notified.
Rescue personnel from the following agencies responded to assist: the Boulder County Sheriff's Office, Boulder County Parks and Open Space, Rocky Mountain Rescue Group, Sugarloaf Fire, Nederland Fire, and the Boulder County Coroner's Office. All personnel were clear from the scene by 3 p.m.


text:
Contact Supplier
Mr. MorrisLeave a message
|Payment Type:
|Min. Order:
|2000 Piece/Pieces
|Delivery Time:
|45 Days
Basic Info
Model No.: HK-E202
Type: With Switch
Application: Residential/General-Purpose, Commercial
Certification: RoHS, CE
Customized: Customized
Condition: New
Material: PP / Fireproof PP
Product Description
HK-E202 is a two ways master switch European outlet Extension Socket. It was previous version for our HK-E403 series. It was researched and developed since 2007, and it became our hot sale products for European outlet market during last decade. Its body use PP or Fireproof PP, which relatively cut down cost of body material comparing with PC material. Hardware using for full copper.
Product Categories : European Series Extension Sockets > European Extension Sockets
Hot Products


text:
Yann Arthus Bertrand spent 40 years taking compelling photographs the world over. But there was one thing he couldn't understand- why do humans have such a hard time living with each other? What is it about humanity that makes life so hard to understand? Why does each generation have to re-learn the same lessons over and over again? Are we all, in fact, really desiring the same basic things? Happiness, love, freedom, meaning?
Bertrand decided to shift his camera lens away from landscapes to people. He interviewed folks around the globe to capture what it is that makes humans human. In one segment of his film, he meets with actor Cameron Diaz, who shares her own powerful perspective about fame and true happiness. Watch the clip below:
So What Does Make People Happy?
Researchers of a 2005 study noted that there are 3 major causes of happiness: "a genetically determined set point for happiness, happiness-relevant circumstantial factors, and happiness-relevant activities and practices" (1). Since you can't control your genetics, and your circumstances are often out of your hands as well, your focus should be on the 3rd aspect of long-term happiness.
They concluded that the best way to boost your long-term happiness is to take ownership of the things you can do, like these 6 research-backed tricks.
1. Strong Relationships
Harvard researchers began tracking a group of people during the Great Depression and followed their lives over the course of about 80 years, eventually also adding their children to the longitudinal study as well. (2) They found that close relationships, not fame or money, was the greatest contributor to long-term happiness.
Robert Waldinger, current director of the study, a psychiatrist at Massachusetts General Hospital and a professor of psychiatry at Harvard Medical School, summarized: "The surprising finding is that our relationships and how happy we are in our relationships has a powerful influence on our health. Taking care of your body is important, but tending to your relationships is a form of self-care too. That, I think, is the revelation." (2)
In fact, when the researchers checked in with participants in their 50's, the way they described their happiness with relationships was a strong predictor for how physically healthy they would be in their 80's and 90's, which is quite remarkable. (3)
2. Learning How to Process Life Experiences Well
A 2006 study asked people to think about, talk about, or write about their best and worst experiences. Interestingly, they found that doing this activity for negative experiences was actually linked to improved life satisfaction and better physical and mental health; on the other hand, the same activity for positive experiences had the opposite effect. (4)
The takeaway? Learning to mentally process and deal with negative experiences in life is probably better for your happiness in the long run. But dwelling too much on happy memories might actually get in the way of experiencing happiness now. Interesting!
3. Staying Active
A 2017 Harvard study looking at people over the age of 50 revealed that those who have maintained an active lifestyle consistently (11 years or more) had better overall psychological well-being. (5) It's encouraging, of course, to know that you don't have to wait 11 years to feel the effects of a good workout. Pushing your physical limitations releases endorphins and makes for an immediate short-term "feel-good" experience!
4. Set Goals for Yourself (But Not Just Any Type of Goal)
Your brain releases dopamine whenever you experience the rush of a "reward". So it makes sense that setting goals for yourself also sets you up to feel great once you achieve them. (6) There's a catch, however. Setting "zero-sum" goals that based on material gain can actually lead to poorer long-term happiness compared to setting "non-zero" goals that "encompass the welfare of other people besides yourself". (6)
Try setting smart goals for yourself that would benefit both you and the people around you (at work, at home, in your community), especially ones that help you foster better relationships. Meaningful goals like volunteering once a month, working out with your family every week, or learning something new at work every season, will go a long way(6)
5. Spend Your Money on Bonding Experiences, Not Stuff
You've probably heard this tune before, but you can't buy happiness. So instead of planning out a big trip to Best Buy for family Christmas gifts, you'll probably be better off planning a fun family outing. Or rather than saving up for the luxury car you've wanted for years, consider visiting a completely new country with your spouse instead. A 2015 study confirmed previous research that buying experiences is linked to a better life-satisfaction and more long-term happiness than buying 'stuff'. (7)
6. Be Kind and Appreciate Kindness
A 2006 Japanese study found that happy people are better at recognizing kindness extended towards them, and are better at thinking about the happiness in "daily life". Interestingly, counting the ways you've been kind to other people in a given week can actually boost your happiness in the moment! (8) So, take the time out of your day to show your appreciation for the kindness you've been extended.
Are you thankful to your kids for cleaning up the kitchen after dinner? Say thank you by treating them to a fun game of catch outside. Do you appreciate your co-worker pulling extra weight in a busy week? Treat them to lunch! Giving and receiving kindness like this makes for a happier life.
Keep Reading: 30 Things People Regret When They're Old
1. http://psycnet.apa.org/record/2005-06355-003
2. https://news.harvard.edu/gazette/story/2017/04/over-nearly-80-years-harvard-study-has-been-showing-how-to-live-a-healthy-and-happy-life/
3. https://www.ted.com/talks/robert_waldinger_what_makes_a_good_life_lessons_from_the_longest_study_on_happiness
4. http://psycnet.apa.org/record/2006-05169-012
5. https://link.springer.com/article/10.1007/s12160-016-9856-y
6. https://positivepsychologyprogram.com/goal-setting/
7. https://www.sciencedirect.com/science/article/pii/S1057740814000631
8. https://link.springer.com/article/10.1007/s10902-005-3650-z
Products We Love
A Special Message From Our Founders
Over the past few years of working with health experts all over the world, there's one major insight we've learned.
You don't have to rely on expensive medications for the rest of your lives.
Most health problems can often be resolved with a good diet, exercise and a few powerful superfoods. In fact, we've gone through hundreds of scientific papers and 'superfood' claims and only selected the top 5% that are:
- Backed by scientific research
- Affordable
- Simple to use
We then put this valuable information into the Superfood as Medicine Guide: a 100+ page guide on the 7 most powerful superfoods available, including:
- Exact dosages for every health ailment
- DIY recipes to create your own products
- Simple recipes


text:
Florence Prerequisite
- Participants do not need any previous language experience.
- Preference will be given to students with additional language study.
The Bonus Experience
Students who come to Florence with at least one year of prior study of the Italian language on the home campus will be awarded with a Bonus Experience.
The Bonus Experience is both a way to recognize the passion for and commitment to Italian language and culture as well as an opportunity for students to experience different and unique facets of Italy.
Students can choose one of the following Bonus Experience options:
- a five class package for a variety of difference courses (e.g., yoga, dance, ballet, acting, voice lessons, arts, crafts etc.);
- a one month gym membership;
- a gift card for 5 movie or theater shows;
- a ticket to a live Italian music concert;
- a full meal in a typical restaurant (no alcohol allowed or paid for)
Applications (in the form of a paragraph detailing your choice of activity and explaining how it will enhance your Italian experience) must be submitted to us via email (firstname.lastname@example.com) by the end of week 2 in the quarter. Final approval of the proposals is at the discretion of the Program Director and will take into account academic and budgetary considerations.
On-site Language Requirement
All students are required to study or continue their study of the Italian language once in Florence. Our on-site language requirement can be fulfilled as follows:
- First year students must enroll in Italian 1F, 2F, 3F or in Italian 1A, 2A (Accelerated sequence), according to their placement level or previous coursework. Only students with a strong background in another Romance Language will be allowed to enroll in the Accelerated sequence (pending approval by the Language Center).
- Students who have completed the first-year language sequence via Stanford course work or placement test must enroll in either OSPFLOR 021F (completed 3, 2A or 21): Accelerated Second Year Italian Part A, or OSPFLOR 022F (completed 21A or 22): Accelerated Second Year Italian Part B while in Florence. Course enrollment will be determined according to students' placement level or previous coursework. These courses are offered in Fall, Winter and Spring and the grading basis is Letter Grade Only. Please note that students who have completed 21 (second year 1st quarter of the non-accelerated sequence) within 6 months of arriving in Florence can take 22F in Florence; students who have completed 21 more than 6 months prior to their arrival must take 21F.
- Students who have completed the second year language sequence via Stanford course work (22A or 23) or placement test are not required to take Italian language on site, but are encouraged to do so and enroll in OSPFLOR031F: Advanced Oral Communication (when offered*), in a directed reading conducted in Italian, in a class at the University of Florence, or in an academic internship.
NOTE: *OSPFLOR 31F: Advanced Oral Communication is part of our curriculum in Fall, Winter and Spring but will only be offered if a sufficient number of students, who have successfully completed the necessary prerequisites (the second-year language sequence via Stanford course work or placement test), choose to enroll.
We recommend that all students, regardless of level, maximize their use of Italian while they are in Florence, both in and out of class. Our language instructors are very much available, also outside of regular class time, to help students work individually and in groups on bettering their oral and written skills.
As part of the language program, students are encouraged to take part in a number of extra-curricular language activities. For example, they can choose to participate in the "Friends a Firenze" program (i.e. a language exchange with college-age Italians), in public service activities, and in thematic workshops and tandem meetings with their Italian peers. All of these activities represent excellent opportunities to meet locals and improve language skills in an authentic context.
Stanford Language Center
- All students, including native speakers, are expected to demonstrate their level of language ability (writing, verbal and reading) by providing results of a recent language placement test or previous coursework. For any questions, please contact the Language Center (email@example.com) with "BOSP" specified in the subject line.


text:
Electronic Deposit Rpc 855 393 3662 | $100-$1000 Cash loan On the internet. Acquire Today.
Thinking About Payday Loans? Look Here First!
You may be like others, who are in desperate need of quick money. People look at Electronic Deposit Rpc 855 393 3662 as one way to solve their financial problems, although there are many different factors that cause someone's financial issues. If you're consider this type of option, keep reading this article for helpful tips about this subject.
Conduct the necessary research. This will help you to compare different lenders, different rates, and other important aspects of the process. Compare different lenders to get the best rate. Making the effort to do your research can really pay off financially when all is said and done. You might even find a site compares different lenders to each other.
All payday loan companies are not created equal. So do a bit of research before you find a payday loan lender for you. You can save tons of money by learning about different companies, which will make the whole process simpler.
Avoid thinking it's time to relax after you receive the payday loan. You should always keep any paperwork from the loan so you know the date it is due. If you fail to pay on time, you will end up with a large debt and collection agencies contacting you.
Watch out for companies that automatically roll over the finance charge to the following pay period. This puts you in a debt trap where the payments you are making are just to cover fees rather than paying down the principle. There are stories of people who have paid 500% of the original loan amount due to this practice.
For alot of people who have to get money and cannot, payday loans can help. Everyone needs to make sure they do the research for both the company they plan to use and the loan they are getting before getting a loan. Payday advances often have excessive interest rates, and extra fees can make it very difficult to pay off the loan in a timely manner.
Know what the payday loan fees are prior to getting a loan. Sometimes, the fees could run up to 25 percent of the money that you borrow. The interest rate for this comes out to nearly 400% annually. The fees are even more if you delay payment.
There are some payday loan companies that are fair to their borrowers. Take the time to investigate the company that you want to take a loan out with before you sign anything. Many of these companies do not have your best interest in mind. You have to look out for yourself.
You may be allowed to get more money than you need when you're obtaining a loan, but it's not wise to do this. Lenders will ask this question because the more money that you borrow, the larger interest and extra fees they will obtain from you. Borrow only what you need.
Since you are well informed, you should have a better idea about whether, or not you are going to get a Electronic Deposit Rpc 855 393 3662 . Use what you learned today. Make the decision that is going to benefit you the best. Hopefully, you understand what comes with getting a payday loan. Make moves based upon your needs.
Completely On-Line , Secure & Verify
No Credit Check , No Faxing , No Hassle
Get Fund Fast , Up to $1,000 in 1 Hour


text:
Some providers offer different ways to access mobile banking through a mobile website, mobile applications,…
How to make a mobile deposit
Quick answer: Depositing a check using mobile deposits is easy, convenient, reliable, and safe. Using the camera on your smartphone or tablet, you can deposit a check into your account from anywhere in a flash.
Making a mobile deposit is:
- Easy to do
- Convenient and accessible
- Safe and secure
Easy to do
Set up mobile access or online access through your financial institution. Select the mobile deposit option. Sign the back of the check (just like you would at the ATM or with a teller). Most banks offer a simple process: take a picture of the front and back of the check then press submit. It's simple… start, snap, submit.
Convenient and accessible when and where you need it
Life is busy but mobile deposits can make managing your money and banking more convenient. You have access to your account 24 hours a day, 7 days a week. Banking hours are on your schedule now; there is no need to worry about making it to the bank because you can deposit your checks from virtually anywhere at any time… fast!
Safe and secure
All check deposits are subject to standard check holds regardless of the method of deposit (just like with a teller or at the ATM). With mobile deposits, you will likely receive a confirmation indicating the deposit is in process. If you sign up for mobile alerts, you will be notified immediately when the funds are available. Mobile alerts can also notify you of changes in your account balance and if there is a problem with a deposit. You can rest assured that your deposits are safe but you also want to protect your device and account.
Other considerations to make sure your account information is safeguarded:
- Protect your device with a personal identification number (PIN) in case of loss or theft
- Download the app directly from your financial institution or a reputable app marketplace (such as the Apple App Store or Google Play Store) and connect using your cellular service rather than an unsecured Wi-Fi network


text:
Horse racing: Princess of Sylmar headed to BC Distaff
The final decision will be made on Saturday, when Princess of Sylmar breezes at Belmont Park, but otherwise, it's all systems go for Ed Stanco's 3-year-old filly to run in the Breeders' Cup Distaff.
The Schenectady native Stanco, whose nom de course is King of Prussia Stable, said on Thursday that he has sent the $100,000 supplemental fee to the Breeders' Cup so that Princess of Sylmar can run in the Distaff on Nov. 1 at Santa Anita Park.
He said during the Saratoga Race Course meet that he would prefer to give Princess of Sylmar, a homebred and the only horse Stanco has on the track, a break instead of running in the Breeders' Cup.
The Todd Pletcher-trained filly did not cooperate with that plan, though, by remaining sound, fit and eager to work, so it'll be on to Santa Anita, as long as she comes out of Saturday's work fine.
"We didn't want to be home watching it on TV, with her in the barn, if she was able to go, and hear the commentator say, 'If Princess of Sylmar was here, it would've been different,' " Stanco said. "So, in that sense, this is really for the fans more than for us, because she got a lot bigger than us."
How big?
Princess of Sylmar is the only filly in history to have won the Kentucky Oaks, Coaching Club American Oaks, Alabama and Beldame in the same season.
Those are four Grade I victories that have put Princess of Sylmar in commanding position to win the Eclipse Award for 3-year-old fillies and even gives her an outside shot at Horse of the Year.
Stanco, an actuary and CEO of Toa Reinsurance in Morristown, N.J., has proceeded with the utmost caution with her, though, and said after she upset two-time champion Royal Delta in the Beldame at Belmont Park on Sept. 28 that there was only a "20 percent chance" she would go to the Breeders' Cup.
That, at least, was an increase from the 0 percent chance she had after winning the CCA Oaks and Alabama at Saratoga.
"Todd said all along that we wanted to take it carefully," Stanco said. "She was doing well, so we went to the Beldame to run against Royal Delta because we felt like we had nothing to lose.
"She did that, and she did it exceedingly well. I still didn't want to go to the Breeders' Cup, but Todd said, 'She's doing so well, let's give it a couple weeks.' "
Princess of Sylmar stayed in Saratoga to work for two weeks after the meet ended on Labor Day and breezed at Belmont last Saturday in her first published workout since the Beldame, in which she cruised past the 5-year-old Royal Delta to win by two lengths.
Stanco plans to run her next year at 4, but in the meantime, she has shown all the signs of wanting another race.
The Distaff field is expected to include Royal Delta, who has won the $2 million race (previously the Ladies Classic before being renamed Distaff) the last two years.
Also scheduled to run is the 3-year-old Beholder, the 2012 2-year-old filly champion whom Princess of Sylmar defeated at odds of 38-1 in the Kentucky Oaks at Churchill Downs.
Stanco, a 1967 Linton High graduate who frequently went to Saratoga while growing up in Schenectady, fulfilled a dream — twice — by winning a big stakes race at Saratoga, for which jockey statues will be painted in his now familiar purple silks with the light blue "V" on the chest.
That would've been plenty, but Princess of Sylmar keeps acting like a horse who is sitting on a big performance.
"The analogy I make is to the 1984 Olympics, when Carl Lewis took two jumps, and everyone was waiting for the third one to see if he could break the world record," Stanco said. "He skipped it to save himself for the 100 meters or something, and it was a big, big disappointment.
"We'll take the third jump."


text:
I am the CEO of VGM Group, Inc., a 100% employee-owned company with extraordinary people serving wonderful members, vendor partners, clients, patients, and caregivers. On MikeMallaro.com, you can expect to see my thoughts on healthcare, politics, leadership, the Iowa Hawkeyes and possibly even competitive swimming.
Read more about me on LinkedIn and follow me on Twitter for more!


text:
Love is not what you think it is
Love is not what you think it is. It isn't exclusive. It isn't what you were raised and conditioned to believe. It isn't something you only have or can have with one person. It isn't finite. It isn't conditional. Love is a resonance. Love is simply an energy, the most powerful energy that exists. And "love" exists in all things, even water. Some believe it is God. Some believe love is the energy that manifests all life, source energy. Scientists around the world are discovering that "love", its energy, can mold, shape, and change the form and structure of anything that exists on this planet, water, even us. Dr. Masaru, Dr. Hunt, the movie Secret of Water, all demonstrate how little we know about the invisible forces of energy in us and on our planet. We have yet to understand how to manipulate energy but energy manipulates us… The resonance you carry, how you feel, determines not only your experience but the physical state of your being. Being in love raises our vibration, and so often we believe it is a person causing it, but in reality they are simply triggering our true resonance… Why one person does this while another doesn't is not yet understood but sadly we limit ourselves and our experience of love in the confines of singular human relationships. I believe love is in us, that we are love, and others simply trigger a higher resonance. When we are being molded by opposing energies, like stress and hate, that love is suppressed and our vibration is lowered. But some people raise our vibration, we feel in love or love because they remind us of our truth. The more open you are, the more you can experience love always, alone or with anyone, even in nature. Love is more powerful and vast than you can ever comprehend… Be aware and open. Much love xo #JodiHealy @ jodihealy.com


text:
A blog is like an online diary where you can share your writing and images. Think of it as your own space on the Internet where you can self-publish your thoughts and ideas, without having to seek the approval of an editor! In simple terms it's a website or webpage that allows you to add your own content.
The term blog comes from the words 'web' and 'log', because in their early iterations blogs were often called 'weblogs'. There are over 180 million blogs on the web today with thousands added every day.
A blog is written in an informal and conversational style. It's updated frequently and blogs appear in reverse chronological order as they are published with the newest always appearing at the top of the page.
Blog topics vary. Many people set up blogs just as a creative outlet to share a passion for something like cars, fashion, travel or photography, but a blog is also an opportunity for business owners to publish their own content on their website.
A business blog is a great way for a business to establish their authority in their field, share their ideas and add fresh content to their website on a regular basis, which improves the website's visibility in search engines.
Your blog can be an annex to your business website and have its own tab, or it could be a standalone website of its own.
If you would like to find out more about blogging for your business and need some help to get started, please get in touch with me here.
Caroline Kidd


text:
view large photo
Swipe Photo to View More
Battery Tender Wireless Battery Monitor 081-0172
This item qualities for
$7.50 Flat Rate Shipping *
$7.50 Flat Rate Shipping *
OR Simple-Click Checkout
In Stock
Product InformationStore Part Number: 081-0172
Tired of failing batteries? The Battery Tender 081-0172 Wireless Battery Monitor helps you track your batteries health! With the new wireless battery monitor from Battery Tender, you can be alerted to battery issues before they become a problem with messages sent straight to your phone!
- WiFi Connectivity
- Monitor Battery Remotely
- Avoid Battery Failure With Mobile Alerts
- Compatible With Standard SAE Connectors
- For Use With Battery Tender® APP
Tech Specs
- Dimensions (LxWxH): 3.5 x 2.0 x 0.625 in
- Weight: .1 lb
- Model: 081-0172
- Manufacturer: Deltran
- Shipping Weight (lb.): 1 lb
- Manufacturer Part #: 081-0172
- Made In: Asia
Customers who bought this product also bought:


text:
- 0 :-
Garden Sofa - 1800s
Lisää valvonta, niin ilmoitamme sinulle heti, kun tuotetta on taas varastossa.
Garden Sofa - 1800s
The garden sofa is made after a model from the late 1800s and produced from the finest raw materials in a traditional way as they built sofas in the old days. The carefully selected pine wood, the beautiful details and not least the hand painted linseed oil makes this outdoor furniture something beyond the ordinary. The sofa ages beautifully to delight for body, soul and future generations. The sofa can be ordered in different colors such as green, cream, light gray and English red.
Dimensions: 145 x 87 x 76 cm
For order, please contact us. Delivery time depends on season and demand, 1-4 weeks.


text:
Listening to America in New Orleans
The Huffington Post's "Listen to America" Bus Tour arrived in New Orleans, its final stop on the 25-city tour across the United States to listen to the stories of Americans and to hear about their hopes and dreams for themselves, the nation, and the future.
The drive through Louisiana was filled with green scenery and delicious food. We stopped in Lafayette at a restaurant with local cuisine as a halfway point in between Houston and New Orleans. Eventually, we arrived in NOLA and prepared for our final activations the following two days.
We held the first activation in New Orleans at Louis Armstrong Park in Congo Square, directly adjacent from the French Quarter and only a handful of blocks down from the infamous Bourbon street. While we interviewed pedestrians and locals walking through the park, a group played music with drums, bongos, and other percussion instruments across the plaza. Hundreds of people came by to find out what was going on. It proved to be a great opportunity to discuss the importance of civil discourse for our democracy and to hear from those who were waiting to be interviewed.
"My wife and I disagree about a lot of things, but we always respect each other and never let it get in the way of our relationship," one man said about the differences in political opinions shared by him and his wife. Political incivility has caused tension in many relationships, sometimes even leading to a point where politics cannot be discussed at all between those who disagree. This man's comment about his relationship with his wife, although simple, is symbolic of successful political conversations in general. If everybody treated those who they partake in discourse with in a respectable manner, and agreed to disagree, we can discuss the things that matter and hopefully find commonalities among our opinions that will lead to meaningful and productive solutions.
The last activation, which took place the next day, was at Tulane University. We met with students, faculty, and passerby traffic to have one last chance to hear from people about their thoughts, concerns, passions, philosophies, and outlook on the current state of America. As we packed up after the event, there was a great sense of accomplishment among everybody working the event.
The tour ended with a farewell event at an old opera house. The building itself was large and beautiful, with pictures of those who had done interviews lining the main hall while appetizers and drinks were served to the crowd. Before the final celebration, the HuffPost held an event at the opera house open to the public where journalists spoke about their experiences touring the country. Afterwards, dinner and drinks were served to all those who attended in order to celebrate a job well done.
There is no doubt that the 25 city bus tour was an amazing way to hear from everyday Americans. In total, over 1,500 interviews were conducted with over 1,700 interviewees. Hundreds of citizens throughout the country signed the pledge to Revive Civility & Respect in America, including Mayors, Council Members, State and local legislatures, and community leaders.
The National Institute for Civil Discourse, housed within The University of Arizona College of Social & Behavioral Sciences, and Huffington Post are partnering to do a bus tour of 25 cities to Listen to America. At the height of fake news, distrust in the media, political polarization, and demonization of those with different viewpoints, it's time for the media to listen to America, and it's time for Americans to listen to each other.
Twitter: @NICDInstitute, @HuffPost, #ListentoAmerica, #ReviveCivility
Facebook: https://www.facebook.com/NationalInstituteForCivilDiscourse/


text:
Our friend Jon Waterlow takes time to talk with us about his process of integration from lessons learned at the SpiritQuest Sanctuary in Peru. Jon is a co-host of the "Voices In The Dark" podcast. He is an awesome dude with a great podcast! Check out his work and take a listen to his podcast at the following:
Jons Website
Voices In The Dark Podcast
Check out some of Jons work


text:
Of Time
Original Airdate: 17 Dec, 2006
| [Airfield]
(The Torchwood team are waiting for a small biplane
to land. Sky Gipsy makes it down safely and taxis to a halt next to
them. The pilot is a woman with bright red lipstick.)
JACK: There's no need to be frightened.
[Conference room]
JOHN: But how can you travel fifty years in half an
(Gwen has Emma's file.)
GWEN: It's a bit basic.
[John's room]
JOHN: I was going to close a deal on a shop in
Dublin tomorrow.
[Girl's room]
(Female laughter and a door closing.)
(Gwen hands out passports.)
[Outside the supermarket]
IANTO: I'd suggest you use twenty five pounds for
your food and then twenty pounds for luxuries like cigarettes,
JOHN: Look at all this. We'd just come off
rationing in '53.
[Outside the Millennium Stadium]
JOHN: I'm just going to take a look at the stadium.
You girls stick together now. I'll be back for supper.
(John is standing outside the last remaining house
of a terrace, and it is boarded up.)
[Hostel kitchen]
(Emma is opening the teabags and putting the leaves
into a teapot.)
DIANE: Hello, old girl. Do you miss me?
(John is filling his pipe whist talking to Jack.)
[Hostel lounge]
(Putting up paper chains.)
(Putting their coats on.)
(The waitress shows Owen and Diane to their seats
then leaves.)
[Hostel lounge]
EMMA: What was your favourite song?
(After the meal.)
[Hostel dining room]
(John has laid out a table for two.)
[Owen's apartment]
(Trying to push magazines under the sofa.)
[Gwen's home]
(Emma wakes to the sight of Rhys' naked behind. She
screams. A little later, with him in a dressing
gown, Gwen has joined them.)
GWEN: We can't expect John and Diane to look after
her. I mean, they're complete strangers. I had to take her in.
Diane didn't even come home last night.
[Nursing home]
NURSE: Come and meet Alan, though I'm not sure how
much help he'll be to you.
DIANE: Sixty pounds for half an hour!
[Nursing home]
JOHN: Matthews did three set-ups in twenty minutes,
then Bill Perry cracked home the winner. You said he had wings on his
feet and that's why he was called a winger. You used to say clever
things like that.
JACK: John's witnessing the end of his world, the end of his line. And we can't help. There's no puzzle to solve, no enemy to fight. Just three lost people who have somehow become our responsibility.
INSTRUCTOR: Best I can do is Friday the twenty
ninth, three o'clock.
(The music is I See You Baby by Groove Armada. A
man approaches Emma.)
[Gwen's home]
(Looking at a Miss B magazine.)
[Owen's apartment]
(Diane is trying to work his laptop when Owen
returns from shopping.)
[Gwen's home]
(Gwen is pouring herself a glass of wine when Emma
[Tourist Information Centre]
JOHN: Need to make a plan, get work, get my driving
[Car park]
(Owen parks up across four bays on the roof level.
They are in evening dress.)
[Gwen's home]
(Rhys is sulking on the sofa.)
[Car park]
(Owen pours champagne from the hamper in the boot.)
[Jack's office]
(Jack's phone rings. He comes out of the hole where
he spends his nights to answer it.)
[Tourist Information Centre]
IANTO: My car keys are missing. John was behind the counter earlier on and I can't get hold of him.
[Jack's office]
(Jack tracks the car.)
(Outside the empty house.)
(John is trying to gas himself with the exhaust
fumes from Ianto's car.)
[Owen's apartment]
DIANE: You're very quiet.
[Coach station]
GWEN: Emma, these are your tickets, okay? On the
back is your seat number, keep this with you at all times. I've also
got you a return just in case.
Now don't go talking to any strangers and phone me as soon as you get
there, okay?
(Diane has got the Sky Gypsy out of the hangar.)
[Coach station]
GWEN: You don't have to go.
OWEN: Diane, you're not thinking straight. Let's
talk about it.
[Coach station]
(Gwen waves Emma goodbye.)
OWEN: I'll come with you.
<Back to the episode listing
Torchwood and related marks are trademarks of BBC . Copyright © 1963, Present. The web pages on this site are for educational and entertainment purposes only. All other copyrights property of their respective holders.


text:
The PVM system currently supports many languages. C, C++, and Fortran languages are supported in the standard distribution. Third-party groups have created freely available Java, Perl, Python, S, Matlab, TCL/TK, and IDL interfaces to PVM. All these are downloadable from the PVM Web site (www.csm.ornl.gov/pvm). PVM is designed so that an application can be composed of tasks written in any mixture of these languages and the tasks will still be able to exchange data and to synchronize with each other.
The general paradigm for application programming with PVM is as follows. You write one or more sequential programs that contain embedded calls to the PVM library. Each program corresponds to a task making up the application. These programs are compiled for each architecture in the host pool, and the resulting object files are placed at a location accessible from machines in the host pool. To execute an application, you typically start one copy of one task (typically the "manager" or "initiating" task) by hand from a machine within the host pool. This process subsequently spawns other PVM tasks, eventually resulting in a collection of active tasks that then compute on the cluster and exchange messages with each other to solve the problem.
The C and C++ language bindings for the PVM user interface library are implemented as functions, following the general conventions used by most C systems. To elaborate, function arguments are a combination of value parameters and pointers as appropriate, and function result values indicate the outcome of the call. In addition, macro definitions are used for system constants, and global variables such as errno and pvm_errno are the mechanism for discriminating between multiple possible outcomes. Application programs written in C and C++ access PVM library functions by linking against an archival library ('libpvm3.a') that is part of the standard distribution.
Fortran language bindings are implemented as subroutines rather than as functions. This approach was taken because some compilers on the supported architectures would not reliably interface Fortran functions with C functions. One immediate implication of this is that an additional argument is introduced into each PVM library call for status results to be returned to the invoking program. Moreover, library routines for the placement and retrieval of typed data in message buffers are unified, with an additional parameter indicating the datatype. Apart from these differences (and the standard naming prefixes pvm_ for C, and pvmf for Fortran), a one-to-one correspondence exists between the two language bindings. Fortran interfaces to PVM are implemented as library stubs that in turn invoke the corresponding C routines, after casting and/or dereferencing arguments as appropriate. Thus, Fortran applications are required to link against the stubs library ('libfpvm3.a') as well as the C library.
All PVM tasks are identified by an integer task identifier tid. Messages are sent to tids and received from tids. Since tids must be unique across the entire virtual machine, they are supplied by the local pvmd and are not user chosen. Although PVM encodes information into each tid to improve performance, the user is expected to treat the tids as opaque integer identifiers. PVM contains several routines that return tid values so that the user application can identify other tasks in the system.
As mentioned earlier, tasks interact through explicit message passing, identifying each other with a system-assigned, opaque tid.
Shown in Figure 10.2 is the body of the PVM program 'hello.c', a simple example that illustrates the basic concepts of PVM programming. This program is intended to be invoked manually; after printing its task id (obtained with pvm_mytid()), it initiates a copy of another program called 'hello_other.c' using the pvm_spawn() function. A successful spawn causes the program to execute a blocking receive using pvm_recv. After the message is received, it is unpacked into a format the receiving computer understands using pvm_upkstr. Then the program prints the message as well its task id. The final pvm_exit call dissociates the program from the PVM system.
#include "pvm3.h" main() { int cc, tid, msgtag; char buf [100]; printf("i'm t%x\n", pvm_mytid()); cc = pvm_spawn("hello_other", (char**)0, 0, "", 1, &tid); if (cc == 1) { msgtag = 1; pvm_recv(tid, msgtag); pvm_upkstr(buf); printf("from t%x: %s\n", tid, buf); } else printf("can't start hello_other\n"); pvm_exit(); }
Figure 10.3 is a listing of the hello_other program. Its first PVM action is to obtain the task id of its parent using the pvm_parent call. This program then obtains its hostname and transmits it to the parent using the three-call sequence: pvm_initsend to initialize the (transparent) send buffer; pvm_pkstr to place a string in a strongly typed and architecture-independent manner into the send buffer; and pvm_send to transmit it to the destination process specified by ptid, "tagging" the message with the number 1.
#include "pvm3.h" main() { int ptid, msgtag; char buf[100]; ptid = pvm_parent(); strcpy(buf, "hello, world from "); gethostname(buf + strlen(buf), 64); msgtag = 1; pvm_initsend(PvmDataDefault); pvm_pkstr(buf); pvm_send(ptid, msgtag); pvm_exit(); }
Message tags are user-defined identifiers put on a message by the sender so that the receiving task can selectively get a particular message from the many that may have arrived. The receiver does not have to, nor may it be able to, know the tag put on a message. It is possible in PVM to probe for what tags have arrived so far. It is also possible to ignore the tag and simply receive the messages in the order they arrive at the receiving task. Message tags will become necessary as we explore more complicated PVM examples.
The next example, 'forkjoin.c', demonstrates spawning a parallel application from one cluster node. We then show PVM used in a Fortran dot product program PSDOT.F and a matrix multiply example that demonstrates the use of groups. Lastly, we show an example of a master/worker PVM application that calculates heat diffusion through a wire.
The fork/join example demonstrates how to spawn off PVM tasks and synchronize with them. The program spawns the number of tasks specified by the user during startup. The children then synchronize by sending a message to their parent task. The parent receives a message from each of the spawned tasks and prints out information about the message from the child tasks.
This program contains the code for both the parent and the child tasks. Let's examine it in more detail. The first action the program takes is to call pvm_mytid(). In fork/join we check the value of mytid; if it is negative, indicating an error, we call pvm_perror() and exit the program. The pvm_perror() call will print a message indicating what went wrong with the last PVM call. In this case the last call was pvm_mytid(), so pvm_perror() might print a message indicating that PVM hasn't been started on this machine. The argument to pvm_perror() is a string that will be prepended to any error message printed by pvm_perror(). In this case we pass argv[0], which is the name of the program as it was typed on the command-line. The pvm_perror() function is modeled after the Unix perror() function.
Assuming we obtained a valid result for mytid, we now call pvm_parent(). The pvm_parent() function will return the tid of the task that spawned the calling task. Since we run the initial forkjoin program from a command prompt, this initial task will not have a parent; it will not have been spawned by some other PVM task but will have been started manually by the user. For the initial fork/join task the result of pvm_parent() will not be any particular task id but an error code, PvmNoParent. Thus we can distinguish the parent fork/join task from the children by checking whether the result of the pvm_parent() call is equal to PvmNoParent. If this task is the parent, then it must spawn the children. If it is not the parent, then it must send a message to the parent.
Let's examine the code executed by the parent task. The number of tasks is taken from the command-line as argv[1]. If the number of tasks is not legal, then we exit the program, calling pvm_exit() and then returning. The call to pvm_exit() is important because it tells PVM this program will no longer be using any of the PVM facilities. (In this case the task exits and PVM will deduce that the dead task no longer needs its services. Regardless, it is good style to exit cleanly.) If the number of tasks is valid, fork/join will then attempt to spawn the children.
The pvm_spawn() call tells PVM to start ntask tasks named argv[0]. The second parameter is the argument list given to the spawned tasks. In this case we don't care to give the children any particular command-line arguments, so this value is null. The third parameter to spawn, PvmTaskDefault, is a flag telling PVM to spawn the tasks in the default method. The default method is to distribute the tasks round robin to all the cluster nodes in the virtual machine. Had we been interested in placing the children on a specific machine or a machine of a particular architecture, we would have used PvmTaskHost or PvmTaskArch for this flag and specified the host or architecture as the fourth parameter. Since we don't care where the tasks execute, we use PvmTaskDefault for the flag and null for the fourth parameter. Finally, ntask tells spawn how many tasks to start, and the integer array child will hold the task ids of the newly spawned children. The return value of pvm_spawn() indicates how many tasks were successfully spawned. If info is not equal to ntask, then some error occurred during the spawn. In case of an error, the error code is placed in the task id array, child, instead of the actual task id; forkjoin loops over this array and prints the task ids or any error codes. If no tasks were successfully spawned, then the program exits.
For each child task, the parent receives a message and prints out information about that message. The pvm_recv() call receives a message from any task as long as the tag for that message is JOINTAG. The return value of pvm_recv() is an integer indicating a message buffer. This integer can be used to find out information about message buffers. The subsequent call to pvm_bufinfo() does just this; it gets the length, tag, and task id of the sending process for the message indicated by buf. In forkjoin the messages sent by the children contain a single integer value, the task id of the child task. The pvm_upkint() call unpacks the integer from the message into the mydata variable. As a sanity check, forkjoin tests the value of mydata and the task id returned by pvm_bufinfo(). If the values differ, the program has a bug, and an error message is printed. Finally, the information about the message is printed, and the parent program exits.
The last segment of code in forkjoin will be executed by the child tasks. Before data is placed in a message buffer, the buffer must be initialized by calling pvm_initsend(). The parameter PvmDataDefault indicates that PVM should do whatever data conversion is needed to ensure that the data arrives in the correct format on the destination processor. In some cases this may result in unnecessary data conversions. If you are sure no data conversion will be needed because the destination machine uses the same data format, then you can use PvmDataRaw as a parameter to pvm_initsend(). The pvm_pkint() call places a single integer, mytid, into the message buffer. It is important to make sure the corresponding unpack call exactly matches the pack call. Packing an integer and unpacking it as a float is an error. There should be a one-to-one correspondence between pack and unpack calls. Finally, the message is sent to the parent task using a message tag of JOINTAG.
pvm_perror("calling pvm_initsend"); pvm_exit(); return -1; } info = pvm_pkint(&mytid, 1, 1); if (info < 0) { pvm_perror("calling pvm_pkint"); pvm_exit(); return -1; } info = pvm_send(myparent, JOINTAG); if (info < 0) { pvm_perror("calling pvm_send"); pvm_exit(); return -1; } pvm_exit(); return 0; }
Figure 10.4 shows the output of running fork/join. Notice that the order the messages were received is nondeterministic. Since the main loop of the parent processes messages on a first-come first-served basis, the order of the prints are determined simply by the time it takes messages to travel from the child tasks to the parent.
/* Fork Join Example Demonstrates how to spawn processes and exchange messages */ /* defines and prototypes for the PVM library */ #include <pvm3.h> /* Maximum number of children this program will spawn */ #define MAXNCHILD 20 /* Tag to use for the joing message */ #define JOINTAG 11 int main(int argc, char* argv[]) { /* number of tasks to spawn, use 3 as the default */ int ntask = 3; /* return code from pvm calls */ int info; /* my task id */ int mytid; /* my parents task id */ int myparent; /* children task id array */ int child[MAXNCHILD]; int i, mydata, buf, len, tag, tid; /* find out my task id number */ mytid = pvm_mytid(); /* check for error */ if (mytid < 0) { /* print out the error */ pvm_perror(argv[0]); /* exit the program */ return -1; } /* find my parent's task id number */ myparent = pvm_parent(); /* exit if there is some error other than PvmNoParent */ if ((myparent < 0) && (myparent != PvmNoParent) && (myparent != PvmParentNotSet)) { pvm_perror(argv[0]); pvm_exit (); return -1; } /* if i don't have a parent then i am the parent */ if (myparent == PvmNoParent || myparent == PvmParentNotSet) { /* find out how many tasks to spawn */ if (argc == 2) ntask = atoi(argv[l]) ; /* make sure ntask is legal */ if ((ntask < 1) || (ntask > MAXNCHILD)) { pvm_exit(); return 0; } /* spawn the child tasks */ info = pvm_spawn(argv[0], (char**)0, PvmTaskDefault, (char*)0, ntask, child); /* print out the task ids */ for (i = 0; i < ntask; i++) if (child[i] < 0) /* print the error code in decimal*/ printf(" %d", child[i]); else /* print the task id in hex */ printf("t%x\t", child[i]); putchar('\n'); /* make sure spawn succeeded */ if (info == 0) { pvm_exit(); return -1; } /* only expect responses from those spawned correctly */ ntask = info; for (i = 0; i < ntask; i++) { /* recv a message from any child process */ buf = pvm_recv(-1, JOINTAG); if (buf < 0) pvm_perror("calling recv"); info = pvm_bufinfo(buf, &len, &tag, &tid); if (info < 0) pvm_perror("calling pvm_bufinfo"); info = pvm_upkint(&mydata, 1, 1); if (info < 0) pvm_perror("calling pvm_upkint"); if (mydata != tid) printf("This should not happen!\n"); printf("Length %d, Tag %d, Tid t%x\n", len, tag, tid); } pvm_exit(); return 0; } /* i'm a child */ info = pvm_initsend(PvmDataDefault); if (info < 0) { % forkjoin t10001c t40149 tc0037 Length 4, Tag 11, Tid t40149 Length 4, Tag 11, Tid tc0037 Length 4, Tag 11, Tid t10001c % forkjoin 4 t10001e t10001d t4014b tc0038 Length 4, Tag 11, Tid t4014b Length 4, Tag 11, Tid tc0038 Length 4, Tag 11, Tid t10001d Length 4, Tag 11, Tid t10001e
Here we show a simple Fortran program, PSDOT, for computing a dot product. The program computes the dot product of two arrays, X and Y. First PSDOT calls PVMFMYTID() and PVMFPARENT(). The PVMFPARENT call will return PVMNOPARENT if the task wasn't spawned by another PVM task. If this is the case, then PSDOT task is the master and must spawn the other worker copies of PSDOT.PSDOT then asks the user for the number of processes to use and the length of vectors to compute. Each spawned process will receive n/nproc elements of X and Y, where n is the length of the vectors and nproc is the number of processes being used in the computation. If nproc does not divide n evenly, then the master will compute the dot product on the extra elements. The subroutine SGENMAT randomly generates values for X and Y. PSDOT then spawns nproc-1 copies of itself and sends each new task a part of the X and Y arrays. The message contains the length of the subarrays in the message and the subarrays themselves. After the master spawns the worker processes and sends out the subvectors, the master then computes the dot product on its portion of X and Y. The master process then receives the other local dot products from the worker processes. Notice that the PVMFRECV call uses a wild card (-1) for the task id parameter. This indicates that a message from any task will satisfy the receive. Using the wild card in this manner results in a race condition. In this case the race condition does not cause a problem because addition is commutative; in other words, it doesn't matter in which order we add up the partial sums from the workers. However, unless one is certain that the race will not affect the program adversely, race conditions should be avoided.
Once the master receives all the local dot products and sums them into a global dot product, it then calculates the entire dot product locally. These two results are then subtracted, and the difference between the two values is printed. A small difference can be expected because of the variation in floating-point roundoff errors.
If the PSDOT program is a worker, then it receives a message from the master process containing subarrays of X and Y. It calculates the dot product of these subarrays and sends the result back to the master process. In the interests of brevity we do not include the SGENMAT and SDOT subroutines.
PROGRAM PSDOT * * PSDOT performs a parallel inner (or dot) product, where the vectors * X and Y start out on a master node, which then sets up the virtual * machine, farms out the data and work, and sums up the local pieces * to get a global inner product. * * .. External Subroutines .. EXTERNAL PVMFMYTID, PVMFPARENT, PVMFSPAWN, PVMFEXIT, PVMFINITSEND EXTERNAL PVMFPACK, PVMFSEND, PVMFRECV, PVMFUNPACK, SGENMAT * * .. External Functions .. INTEGER ISAMAX REAL SDOT EXTERNAL ISAMAX, SDOT * * .. Intrinsic Functions .. INTRINSIC MOD * * .. Parameters .. INTEGER MAXN PARAMETER ( MAXN = 8000 ) INCLUDE 'fpvm3.h' * * .. Scalars .. INTEGER N, LN, MYTID, NPROCS, IBUF, IERR INTEGER I, J, K REAL LOOT, GDOT * * .. Arrays .. INTEGER TIDS(0:63) REAL X(MAXN), Y(MAXN) * * Enroll in PVM and get my and the master process' task ID number * CALL PVMFMYTID( MYTID ) CALL PVMFPARENT( TIDS(0) ) * * If I need to spawn other processes (I am master process) * IF ( TIDS(0) EQ. PVMNOPARENT ) THEN * * Get starting information * WRITE(*,*) 'How many processes should participate (1-64)?' READ(*,*) NPROCS WRITE(*,2000) MAXN READ(*,*) N TIDS(0) = MYTID IF ( N GT. MAXN ) THEN WRITE(*,*) 'N too large. Increase parameter MAXN to run'// $ 'this case.' STOP END IF * * LN is the number of elements of the dot product to do * locally. Everyone has the same number, with the master * getting any left over elements. J stores the number of * elements rest of procs do. * J = N / NPROCS LN = J + MOD(N, NPROCS) I = LN + 1 * * Randomly generate X and Y * Note: SGENMAT() routine is not provided here * CALL SGENMAT( N, 1, X, N, MYTID, NPROCS, MAXN, J ) CALL SGENMAT( N, 1, Y, N, I, N, LN, NPROCS ) * * Loop over all worker processes * DO 10 K = 1, NPROCS-1 * * Spawn process and check for error * CALL PVMFSPAWN( 'psdot', 0, 'anywhere', 1, TIDS(K), IERR ) IF (IERR .NE. 1) THEN WRITE(*,*) 'ERROR, could not spawn process #',K, $ '. Dying . . .' CALL PVMFEXIT( IERR ) STOP END IF * * Send out startup info * CALL PVMFINITSEND( PVMDEFAULT, IBUF ) CALL PVMFPACK( INTEGER4, J, 1, 1, IERR ) CALL PVMFPACK( REAL4, X(I), J, 1, IERR ) CALL PVMFPACK( REAL4, Y(I), J, 1, IERR ) CALL PVMFSEND( TIDS(K), 0, IERR ) I = I + J 10 CONTINUE * * Figure master's part of dot product * SDOT() is part of the BLAS Library (compile with -lblas) * GDOT = SDOT( LN, X, 1, Y, 1 ) * * Receive the local dot products, and * add to get the global dot product * DO 20 K = 1, NPROCS-1 CALL PVMFRECV( -1, 1, IBUF ) CALL PVMFUNPACK( REAL4, LDOT, 1, 1, IERR ) GDOT = GDOT + LDOT 20 CONTINUE * * Print out result * WRITE(*,*) ' ' WRITE(*,*) '<x,y> = ',GDOT * * Do sequential dot product and subtract from * distributed dot product to get desired error estimate * LDOT = SDOT( N, X, 1, Y, 1 ) WRITE(*,*) '<x,y> : sequential dot product. <x,y>^ : '// $ 'distributed dot product.' WRITE(*,*) '| <x,y> - <x,y>^ | = ' ,ABS(GDOT - LDOT) WRITE(*,*) 'Run completed.' * * If I am a worker process (i.e. spawned by master process) * ELSE * * Receive startup info * CALL PVMFRECV( TIDS(0), 0, IBUF ) CALL PVMFUNPACK( INTEGER4, LN, 1, 1, IERR ) CALL PVMFUNPACK( REAL4, X, LN, 1, IERR ) CALL PVMFUNPACK( REAL4, Y, LN, 1, IERR ) * * Figure local dot product and send it in to master * LDOT = SDOT( LN, X, 1, Y, 1 ) CALL PVMFINITSEND( PVMDEFAULT, IBUF ) CALL PVMFPACK( REAL4, LDOT, 1, 1, IERR ) CALL PVMFSEND( TIDS(0), 1, IERR ) END IF * CALL PVMFEXIT( 0 ) * 1000 FORMAT(I10,' Successfully spawned process #' ,I2,', TID =',I10) 2000 FORMAT('Enter the length of vectors to multiply (1 -',I7,'):') STOP * * End program PSDOT * END
In this example we program a matrix multiply algorithm described by Fox et al. in [39]. The mmult program can be found at the end of this section. The mmult program will calculate C = AB where C, A, and B are all square matrices. For simplicity we assume that m m tasks are used to calculate the solution. Each task calculates a subblock of the resulting matrix C. The block size and the value of m are given as a command-line argument to the program. The matrices A and B are also stored as blocks distributed over the m2 tasks. Before delving into the details of the program, let us first describe the algorithm at a high level.
In our grid of m x m tasks, each task (tij, where 0 ≤ i, j < m), initially contains blocks Cij, Aij, and Bij. In the first step of the algorithm the tasks on the diagonal (tij where i = j) send their block Aii to all the other tasks in row i. After the transmission of Aii, all tasks calculate Aii Bij and add the result into Cij. In the next step, the column blocks of B are rotated. That is, tij sends its block of B to t(i-1)j. (Task t0j sends its B block to t(m-1)j.) The tasks now return to the first step, Ai(i+1) is multicast to all other tasks in row i, and the algorithm continues. After m iterations, the C matrix contains A B, and the B matrix has been rotated back into place.
Let us now go over the matrix multiply as it is programmed in PVM. In PVM there is no restriction on which tasks may communicate with which other tasks. However, for this program we would like to think of the tasks as a two-dimensional conceptual torus. In order to enumerate the tasks, each task joins the group mmult. Group ids are used to map tasks to our torus. The first task to join a group is given the group id of zero. In the mmult program, the task with group id zero spawns the other tasks and sends the parameters for the matrix multiply to those tasks. The parameters are m and bklsize, the square root of the number of blocks and the size of a block, respectively. After all the tasks have been spawned and the parameters transmitted, pvm_barrier() is called to make sure all the tasks have joined the group. If the barrier is not performed, later calls to pvm_gettid() might fail because a task may not have yet joined the group.
After the barrier, the task ids for the other tasks are stored in the row in the array myrow. Specifically, the program calculates group ids for all the tasks in the row, and we ask PVM for the task id for the corresponding group id. Next the program allocates the blocks for the matrices using malloc(). (In an actual application program we would expect that the matrices would already be allocated.) Then the program calculates the row and column of the block of C it will be computing; this calculation is based on the value of the group id. The group ids range from 0 to m - 1 inclusive. Thus, the integer division of (mygid/m) will give the task's row and (mygid mod m) will give the column if we assume a row major mapping of group ids to tasks. Using a similar mapping, we calculate the group id of the task directly above and below in the torus and store their task ids in up and down, respectively.
Next the blocks are initialized by calling InitBlock(). This function simply initializes A to random values, B to the identity matrix, and C to zeros. This will allow us to verify the computation at the end of the program by checking that A = C.
Finally we enter the main loop to calculate the matrix multiply. First the tasks on the diagonal multicast their block of A to the other tasks in their row. Note that the array myrow actually contains the task id of the task doing the multicast. Recall that pvm_mcast() will send to all the tasks in the tasks array except the calling task. This approach works well in the case of mmult because we don't want to have to needlessly handle the extra message coming into the multicasting task with an extra pvm_recv(). Both the multicasting task and the tasks receiving the block calculate the AB for the diagonal block and the block of B residing in the task.
After the subblocks have been multiplied and added into the C block, we now shift the B blocks vertically. Specifically, the block of B is packed into a message and sent to the up task id; then a new B block is received from the down task id.
Note that we use different message tags for sending the A blocks and the B blocks as well as for different iterations of the loop. We also fully specify the task ids when doing a pvm_recv(). It's tempting to use wild cards for the fields of pvm_recv(); however, such use can be dangerous. For instance, had we incorrectly calculated the value for up and used a wild card for the pvm_recv() instead of down, we would be sending messages to the wrong tasks without knowing it. In this example we fully specify messages, thereby reducing the possibility of receiving a message from the wrong task or the wrong phase of the algorithm.
Once the computation is complete, we check to see that A = C, just to verify that the matrix multiply correctly calculated the values of C. This step would not be done in a matrix-multiply library routine, for example.
You do not have to call pvm_lvgroup() because PVM will automatically detect that the task has exited and will remove it from the group. It is good form, however, to leave the group before calling pvm_exit(). The reset command from the PVM console will reset all the PVM groups. The pvm_gstat command will print the status of any groups that currently exist.
/* Matrix Multiply */ /* defines and prototypes for the PVM library */ #include <pvm3.h> #include <stdio.h> /* Maximum number of children this program will spawn */ #define MAXNTIDS 100 #define MAXROW 10 /* Message tags */ #define ATAG 2 #define BTAG 3 #define DIMTAG 5 void InitBlock(float *a, float *b, float *c, int blk, int row, int col) { int len, ind; int i,j; srand(pvm_mytid()); len = blk*blk; for (ind = 0; ind < len; ind++) { a[ind] = (float)(rand()%1000)/100.0; c[ind] = 0.0; } for (i = 0; i < blk; i++) { for (j = 0; j < blk; j++) { if (row == col) b[j*blk+i] = (i==j)? 1.0 : 0.0; else b[j*blk+i] = 0.0; } } } void BlockMult(float* c, float* a, float* b, int blk) { int i,j,k; for (i = 0; i < blk; i++) for (j = 0; j < blk; j ++) for (k = 0; k < blk; k++) c[i*blk+j] += (a[i*blk+k] * b[k*blk+j]); } int main(int argc, char* argv[]) { /* number of tasks to spawn, use 3 as the default */ int ntask = 2; /* return code from pvm calls */ int info; /* my task and group id */ int mytid, mygid; /* children task id array */ int child[MAXNTIDS-1]; int i, m, blksize; /* array of the tids in my row */ int myrow[MAXROW]; float *a, *b, *c, *atmp; int row, col, up, down; /* find out my task id number */ mytid = pvm_mytid(); pvm_setopt(PvmRoute, PvmRouteDirect); /* check for error */ if (mytid < 0) { /* print out the error */ pvm_perror(argv[0]); /* exit the program */ return -1; } /* join the mmult group */ mygid = pvm_joingroup("mmult"); if (mygid < 0) { pvm_perror(argv[0]); pvm_exit(); return -1; } /* if my group id is 0 then I must spawn the other tasks */ if (mygid == 0) { /* find out how many tasks to spawn */ if (argc == 3) { m = atoi(argv[1]); blksize = atoi(argv[2]); } if (argc < 3) { fprintf(stderr, "usage: mmult m blk\n"); pvm_lvgroup("mmult"); pvm_exit(); return -1; } /* make sure ntask is legal */ ntask = m*m; if ((ntask < 1) || (ntask >= MAXNTIDS)) { fprintf(stderr, "ntask = %d not valid.\n", ntask); pvm_lvgroup("mmult"); pvm_exit(); return -1; } /* if there is more than one task spawn them*/ if (ntask > 1) { /* spawn the child tasks */ info = pvm_spawn("mmult", (char**)0, PvmTaskDefault, (char*)0, ntask-1, child); /* make sure spawn succeeded */ if (info != ntask-1) { pvm_lvgroup("mmult"); pvm_exit(); return -1; } /* send the matrix dimension */ pvm_initsend(PvmDataDefault); pvm_pkint(&m, 1, 1); pvm_pkint(&blksize, 1, 1); pvm_mcast(child, ntask-1, DIMTAG); } } else { /* recv the matrix dimension */ pvm_recv(pvm_gettid("mmult", 0), DIMTAG); pvm_upkint(&m, 1, 1); pvm_upkint(&blksize, 1, 1); ntask = m*m; } /* make sure all tasks have joined the group */ info = pvm_barrier("mmult",ntask); if (info < 0) pvm_perror(argv[0]); /* find the tids in my row */ for (i = 0; i < m; i++) myrow[i] = pvm_gettid("mmult", (mygid/m)*m + i); /* allocate the memory for the local blocks */ a = (float*)malloc(sizeof(float)*blksize*blksize); b = (float*)malloc(sizeof(float)*blksize*blksize); c = (float*)malloc(sizeof(float)*blksize*blksize); atmp = (float*)malloc(sizeof(float)*blksize*blksize); /* check for valid pointers */ if (!(a && b && c && atmp)) { fprintf(stderr, "%s: out of memory!\n", argv[0]); free(a); free(b); free(c); free(atmp); pvm_lvgroup("mmult"); pvm_exit(); return -1; } /* find my block's row and column */ row = mygid/m; col = mygid % m; /* calculate the neighbor's above and below */ up = pvm_gettid("mmult", ((row)?(row-1):(m-1))*m+col); down = pvm_gettid("mmult", ((row == (m-1))?col:(row+1)*m+col)); /* initialize the blocks */ InitBlock(a, b, c, blksize, row, col); /* do the matrix multiply */ for (i = 0; i < m; i++) { /* mcast the block of matrix A */ if (col == (row + i)%m) { pvm_initsend(PvmDataDefault); pvm_pkfloat(a, blksize*blksize, 1); pvm_mcast(myrow, m, (i+1)*ATAG); BlockMult(c,a,b,blksize); } else { pvm_recv(pvm_gettid("mmult", row*m + (row +i)%m), (i+1)*ATAG); pvm_upkfloat(atmp, blksize*blksize, 1); BlockMult(c,atmp,b,blksize); } /* rotate the columns of B */ pvm_initsend(PvmDataDefault); pvm_pkfloat(b, blksize*blksize, 1); pvm_send(up, (i+1)*BTAG); pvm_recv(down, (i+1)*BTAG); pvm_upkfloat(b, blksize*blksize, 1); } /* check it */ for (i = 0 ; i < blksize*blksize; i++) if (a[i] != c[i]) printf("Error a[%d] (%g) != c[%d] (%g) \n", i, a[i],i,c[i]); printf("Done.\n"); free(a); free(b); free(c); free(atmp); pvm_lvgroup("mmult"); pvm_exit(); return 0; }
Here we present a PVM program that calculates heat diffusion through a substrate, in this case a wire. Consider the one-dimensional heat equation on a thin wire,
and a discretization of the form
giving the explicit formula
The initial and boundary conditions are
A(t, 0) = 0, A(t, 1) = 0 for all t
A(0, x) = sin(πx) for 0 ≤ x ≤ 1.
The pseudocode for this computation is as follows:
for i = 1:tsteps-1; t = t+dt; a(i+1,1)=0; a(i+1,n+2)=0; for j = 2:n+1; a(i+1,j)=a(i,j) + mu*(a(i,j+1)-2*a(i,j)+a(i,j-1)); end; end
For this example we use a master/worker programming model. The master, 'heat.c', spawns five copies of the program heatslv. The workers compute the heat diffusion for subsections of the wire in parallel. At each time step the workers exchange boundary information, in this case the temperature of the wire at the boundaries between processors.
Let's take a closer look at the code. In 'heat.c' the array solution will hold the solution for the heat diffusion equation at each time step. First the heatslv tasks are spawned. Next, the initial dataset is computed. Notice that the ends of the wires are given initial temperature values of zero.
The main part of the program is then executed four times, each with a different value for Δt. A timer is used to compute the elapsed time of each compute phase. The initial datasets are sent to the heatslv tasks. The left and right neighbor task ids are sent along with the initial dataset. The heatslv tasks use these to communicate boundary information. Alternatively, we could have used the PVM group calls to map tasks to segments of the wire. By using that approach we would have avoided explicitly communicating the task ids to the slave processes.
After sending the initial data, the master process waits for results. When the results arrive, they are integrated into the solution matrix, the elapsed time is calculated, and the solution is written to the output file.
Once the data for all four phases have been computed and stored, the master program prints out the elapsed times and kills the slave processes.
/* heat.c Use PVM to solve a simple heat diffusion differential equation, using 1 master program and 5 slaves. The master program sets up the data, communicates it to the slaves and waits for the results to be sent from the slaves. Produces xgraph ready files of the results. */ #include "pvm3.h" #include <stdio.h> #include <math.h> #include <time.h> #define SLAVENAME "heatslv" #define NPROC 5 #define TIMESTEP 100 #define PLOTINC 10 #define SIZE 1000 int num_data = SIZE/NPROC; main() { int mytid, task_ids[NPROC], i, j; int left, right, k, 1; int step = TIMESTEP; int info; double init[SIZE], solution[TIMESTEP][SIZE]; double result[TIMESTEP*SIZE/NPROC], deltax2; FILE *filenum; char *filename [4] [7] ; double deltat[4]; time_t t0; int etime [4] ; filename[0][0] = "graph1"; filename[1][0] = "graph2"; filename[2][0] = "graph3"; filename[3][0] = "graph4"; deltat[0] = 5.0e-1; deltat[1] = 5.0e-3; deltat[2] = 5.0e-6; deltat[3] = 5.0e-9; /* enroll in pvm */ mytid = pvm_mytid(); /* spawn the slave tasks */ info = pvm_spawn(SLAVENAME,(char **)0,PvmTaskDefault,"", NPROC,task_ids); /* create the initial data set */ for (i = 0; i < SIZE; i++) init[i] = sin(M_PI * ( (double)i / (double)(SIZE-1) )); init[0] = 0.0; init[SIZE-1] = 0.0; /* run the problem 4 times for different values of delta t */ for (1 = 0; 1 < 4; 1++) { deltax2 = (deltat[1]/pow(1.0/(double)SIZE,2.0)); /* start timing for this run */ time(&t0); etime[1] = t0; /* send the initial data to the slaves. */ /* include neighbor info for exchanging boundary data */ for (i = 0; i < NPROC; i++) { pvm_initsend(PvmDataDefault); left = (i == 0) ? 0 : task_ids[i-1]; pvm_pkint(&left, 1, 1); right = (i == (NPROC-1)) ? 0 : task_ids[i+1]; pvm_pkint(&right, 1, 1); pvm_pkint(&step, 1, 1); pvm_pkdouble(&deltax2, 1, 1); pvm_pkint(&num_data, 1, 1); pvm_pkdouble(&init[num_data*i], num_data, 1); pvm_send(task_ids[i], 4); } /* wait for the results */ for (i = 0; i < NPROC; i++) { pvm_recv(task_ids[i], 7); pvm_upkdouble(&result[0], num_data*TIMESTEP, 1); /* update the solution */ for (j = 0; j < TIMESTEP; j++) for (k = 0; k < num_data; k++) solution[j][num_data*i+k] = result[wh(j,k)]; } /* stop timing */ time(&t0); etime[1] = t0 - etime[l]; /* produce the output */ filenum = fopen(filename[1][0], "w"); fprintf(filenum,"TitleText: Wire Heat over Delta Time: %e\n", deltat[1]); fprintf(filenum,"XUnitText: Distance\nYUnitText: Heat\n"); for (i = 0; i < TIMESTEP; i = i + PLOTINC) { fprintf(filenum,"\"Time index: %d\n",i); for (j = 0; j < SIZE; j++) fprintf(filenum,"%d %e\n",j, solution[i][j]); fprintf(filenum,"\n"); } fclose (filenum); } /* print the timing information */ printf("Problem size: %d\n",SIZE); for (i = 0; i < 4; i++) printf("Time for run %d: %d sec\n",i,etime[i]); /* kill the slave processes */ for (i = 0; i < NPROC; i++) pvm_kill(task_ids[i]); pvm_exit(); } int wh(x, y) int x, y; { return(x*num_data+y); }
The heatslv programs do the actual computation of the heat diffusion through the wire. The worker program consists of an infinite loop that receives an initial dataset, iteratively computes a solution based on this dataset (exchanging boundary information with neighbors on each iteration), and sends the resulting partial solution back to the master process. As an alternative to using an infinite loop in the worker tasks, we could send a special message to the worker ordering it to exit. Instead, we simply use the infinite loop in the worker tasks and kill them off from the master program. A third option would be to have the workers execute only once, exiting after processing a single dataset from the master. This would require placing the master's spawn call inside the main for loop of 'heat.c'. While this option would work, it would needlessly add overhead to the overall computation.
For each time step and before each compute phase, the boundary values of the temperature matrix are exchanged. The left-hand boundary elements are first sent to the left neighbor task and received from the right neighbor task. Symmetrically, the right-hand boundary elements are sent to the right neighbor and then received from the left neighbor. The task ids for the neighbors are checked to make sure no attempt is made to send or receive messages to nonexistent tasks.
/* heatslv.c The slaves receive the initial data from the host, exchange boundary information with neighbors, and calculate the heat change in the wire. This is done for a number of iterations, sent by the master. */ #include "pvm3.h" #include <stdio.h> int num_data; main() { int mytid, left, right, i, j, master; int timestep; double *init, *A; double leftdata, rightdata, delta, leftside, rightside; /* enroll in pvm */ mytid = pvm_mytid(); master = pvm_parent(); /* receive my data from the master program */ while(1) { pvm_recv(master, 4); pvm_upkint(&left, 1, 1); pvm_upkint(&right, 1, 1); pvm_upkint(×tep, 1, 1); pvm_upkdouble(&delta, 1, 1); pvm_upkint(&num_data, 1, 1); init = (double *) malloc(num_data*sizeof(double)); pvm_upkdouble(init, num_data, 1); /* copy the initial data into my working array */ A = (double *) malloc(num_data * timestep * sizeof(double)); for (i = 0; i < num_data; i++) A[i] = init[i]; /* perform the calculation */ for (i = 0; i < timestep-1; i++) { /* trade boundary info with my neighbors */ /* send left, receive right */ if (left != 0) { pvm_initsend(PvmDataDefault); pvm_pkdouble(&A[wh(i,0)],1,1); pvm_send(left, 5); } if (right != 0) { pvm_recv(right, 5); pvm_upkdouble(&rightdata, 1, 1); /* send right, receive left */ pvm_initsend(PvmDataDefault); pvm_pkdouble(&A[wh(i,num_data-1)],1,1); pvm_send(right, 6); } if (left != 0) { pvm_recv(left, 6); pvm_upkdouble(&leftdata,1,1); } /* do the calculations for this iteration */ for (j = 0; j < num_data; j++) { leftside = (j == 0) ? leftdata : A[wh(i,j-1)]; rightside = (j == (num_data-1)) ? rightdata : A[wh(i,j+1)]; if ((j==0)&&(left==0)) A[wh(i+1,j)] = 0.0; else if ((j==(num_data-1))&&(right==0)) A[wh(i+1,j)] = 0.0; else A[wh(i+1,j)]= A[wh(i,j)]+delta*(rightside-2*A[wh(i,j)]+leftside); } } /* send the results back to the master program */ pvm_initsend(PvmDataDefault); pvm_pkdouble(&A[0],num_data*timestep,1); pvm_send(master,7); } /* just for good measure */ pvm_exit(); } int wh(x, y) int x, y; { return(x*num_data+y); }
In this section we have given a variety of example programs written in both Fortran and C. These examples demonstrate various ways of writing PVM programs. Some divide the application into two separate programs, while others use a single program with conditionals to handle spawning and computing phases. These examples show different styles of communication, both among worker tasks and between worker and master tasks. In some cases messages are used for synchronization, and in others the master processes simply kill off the workers when they are no longer needed.


text:
General Motors- Chevrolet
Technology & Stuff
|Entrant Company
|Agency Network
|Fleishman-Hillard, Detroit
|Production Company
|n/a, n/a
|Carat, Detroit
|Chief Creative Officer
|Gary Pascoe
|Creative Director
|Rich Weinert
|Creative Director
|Kathy Speck
|Account Director
|Derek Chappo
|Account Director
|Bill Freed
|Account Supervisor
|Danielle Harris
|Project Manager
|Ken Ashburn
|Creative Chairman
|Linus Karlsson
|Executive Creative Director
|Bob Guisgand
|Executive Creative Director
|Duffy Patten
|Associate Creative Director
|Vic Quattrin
|Senior Copywriter
|Scott Wolf
|Executive Producer
|Kelly Balagna
|Print Producer
|Jenine Rhoades
|SVP, North American Business Lead
|Abbey Berryman
|SVP, North American Strategy
|James Trumble
|SVP, Group Director
|Nick Johnston
|Senior Vice President
|Miker Stovall
|Managing Supervisor
|Kelly LaVaute
This 2015 Clio Awards Gold winning entry titled 'Technology & Stuff' was entered for General Motors- Chevrolet. The piece was submitted to the medium: Integrated Campaign within the entry type: Product/Service and the category: Integrated Campaign. It consists of 1 video and 1 image.